Доктрина и Множество сущностей

У меня есть две организации: страна и провинция, и я установил отношение «многие к одному» в этой области:

Объект / Область

/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
private $ubicacionpaisid;

Здесь я получаю все результаты, используя объект Провинция:

 $cb = $this->getDoctrine()
->getEntityManager()
->getRepository(Province::class)
->createQueryBuilder('a');

Однако, если я бегу:

 var_dump($cb->getQuery()->getDQL());

это возвращает:

string(41) "SELECT a FROM AppBundle\Entity\Province a"

Я ожидал увидеть запрос, который соединяет сущность Country с сущностью Province в SQL.

Что мне не хватает?

1

Решение

Я понимаю, что 2 человека дали ответы, которые просто говорят, чтобы использовать EAGER загрузка ассоциации. Но я не могу рекомендовать это. Это делает так много предположений о вашем проекте и о том, как вы всегда хотите присоединиться к этой ассоциации, несмотря ни на что, и даже можете вызвать проблемы с формами и создания неожиданного поведения.

Кроме того, пользователь уже показывает, что использует пользовательский вызов QueryBuilder для захвата данных, так почему бы не использовать соединение явно?

Например:

$cb = $this->getDoctrine()->getEntityManager()->getRepository(Province::class)
->createQueryBuilder('p')
->select('p, c')
->join('p.ubicacionpaisid', 'c')
->getQuery()
->getResult()
;

или еще лучше, из репозитория Province:

return $this->createQueryBuilder('p')
->select('p, c')
->join('p.ubicacionpaisid', 'c')
->getQuery()
->getResult()
;
1

Другие решения

Это может быть потому, что Doctrine имеет 2 типа соединений.
Нормальное соединение и извлечение соединения. В соединении извлечения Doctrine будет предварительно выполнять 2 разных запроса, а затем просто гидрировать результат второго обратно в результат / данные первого.

Это иногда также называют ленивым соединением. Ленивые соединения — это поведение по умолчанию.
Вы можете изменить это поведение, изменив свои отношения с fetch="EAGER"

/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
2

Как сказал DarkMukke …

Вы пытались получить данные?

Добавление в ваши отношения fetch = «EAGER»

/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
private $ubicacionpaisid;

Это должно также извлечь и загрузить связанный объект.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#manytoone

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector