2013-01-21 33 views
14

我很难找到正确的结果。懒惰加载与教条一对一映射

我有一对一的映射。有两个表:

/** 
* @ORM\Table(name="users") 
* @ORM\Entity 
*/ 
class Users { 

    /** 
    * @ORM\OneToOne(targetEntity="UsersSettings", mappedBy="user",cascade={"persist"}) 
    */ 
    private $userSetting; 

    //getters and setters 
} 

/** 
* @ORM\Table(name="notifications_settings") 
* @ORM\Entity 
*/ 
class UsersSettings { 

    /** 
    * @var Users 
    * 
    * @ORM\OneToOne(targetEntity="Users", inversedBy="userSetting") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    * }) 
    */ 
    private $user; 
} 

每当我取如下实体之一:

$q = $this 
      ->createQueryBuilder('u') 
      ->select('u, r') 
      ->leftJoin('u.roles', 'r') 
      ->where('u.username = :username OR u.email = :email') 
      ->setParameter('username', $username) 
      ->setParameter('email', $username) 
      ->getQuery(); 

学说立即执行加入到我不想usersSettings实体:

选择t0.id AS id1,t0.username AS username2,t0.email AS email3,t0.password AS password4,t29.id AS id30,t29.is_notify_by_email AS is_notify_by_email31,t29.user_id AS user_id32 FROM users t0 LEFT JOIN users_settings t29 ON t29.user_id = t0.id WHERE t0.id =?

其他类型,如OneToManyManyToOne映射的执行延迟加载,但在一对一的映射情况下,我无法配置懒加载。我怎样才能延迟加载这个关系?我正在使用教义2.3和Symfony 2.1

回答

0

您可以在注释中启用extra lazy加载使用fetch="EXTRA_LAZY"的关联。

* @ORM\OneToOne(targetEntity="Users", inversedBy="userSetting", fetch="EXTRA_LAZY") 
+4

它还是加入extra_lazy后加入表格。我也曾尝试过,但没有工作 – sonam

+0

您的服务器使用APC吗?更新注释之后,确保你的apc缓存被清除了(如果你必须重新启动apache apache)。除非我重新启动apache,否则某些教义注释没有起作用。 – lifo

+0

我以前启用了APC,但在开发过程中变得头疼,所以APC未启用 – sonam

13

使用提示HINT_FORCE_PARTIAL_LOAD以避免延迟加载。

... 
$qb->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true); 
+3

这当然会暴露另一个问题 - 如果您只想获取未加入的实体的键值(例如id),则会引发异常。 –

+0

给我,它帮助 - 但我担心它会导致其他错误....... –