Ленивая загрузка с доктриной один к одному - программирование
Подтвердить что ты не робот

Ленивая загрузка с доктриной один к одному

Мне сложно найти правильный результат для этого.

У меня есть одно к одному сопоставление. Существуют две таблицы:

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

Doctrine немедленно выполняет соединение с usersSettings, которое я не хочу:

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 JOIN users_settings t29 ON t29.user_id = t0.id WHERE t0.id =?

Другие типы отображения, такие как OneToMany и ManyToOne, выполняют ленивую загрузку, но в случае сопоставления один к одному я не мог настроить ленивую нагрузку. Как я могу лениться загрузить это отношение? Я использую доктрину 2.3 и Symfony 2.1

4b9b3361

Ответ 1

Используйте hint HINT_FORCE_PARTIAL_LOAD, чтобы избежать ленивой загрузки.

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