2013-01-21 38 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

給我,它幫助 - 但我擔心它會導致其他錯誤....... –