2013-01-21 13 views
14

Mam trudności ze znalezieniem prawidłowego wyniku.Leniwe ładowanie z doktryną jeden do jednego mapowanie

Mam odwzorowanie jeden do jednego. Istnieją dwie tabele:

/** 
* @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; 
} 

Ilekroć pobrać jeden podmiot, jak poniżej:

$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(); 

Doktryna natychmiast wykonuje dołączyć do usersSettings podmiotowi, który nie chcę:

SELECT 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 DOŁĄCZ users_settings t29 ON t29.user_id = t0.id WHERE t0.id =?

Inne rodzaje mapowania jak OneToMany i ManyToOne wykonuje leniwy załadunku, ale w przypadku 12:59 mapping, nie mogę skonfigurować do leniwego obciążeniem. Jak mogę leniwy załadować tę relację? Korzystam z doktryny 2.3 i Symfony 2.1

Odpowiedz

0

Możesz włączyć extra lazy ładowanie asocjacji za pomocą fetch="EXTRA_LAZY" w swoich adnotacjach.

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

nadal dołącza do tabel po dodaniu extra_lazy. Próbowałem wcześniej, ale nie działał. – sonam

+0

Czy twój serwer używa APC? Po aktualizacji adnotacji upewnij się, że pamięć podręczna apc jest wyczyszczona (zrestartuj apache apache, jeśli musisz). Wystąpiły problemy z niektórymi adnotacjami do doktryn, które nie mają wpływu, chyba że ponownie uruchomię apache. – lifo

+0

Poprzednio włączałem APC, ale stałem się bólem głowy podczas rozwoju, więc APC nie jest włączone – sonam

13

Użyj wskazówki HINT_FORCE_PARTIAL_LOAD, aby uniknąć leniwego ładowania.

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

To oczywiście ujawnia inny problem - jeśli chcesz po prostu uzyskać kluczową wartość (np. Na przykład) podmiotu, który nie był połączony, spowoduje to zgłoszenie wyjątku. –

+0

mi to pomogło - ale obawiam się, że spowoduje to inne błędy ....... –

Powiązane problemy