У меня есть две организации: страна и провинция, и я установил отношение «многие к одному» в этой области:
Объект / Область
/**
* @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.
Что мне не хватает?
Я понимаю, что 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()
;
Это может быть потому, что Doctrine имеет 2 типа соединений.
Нормальное соединение и извлечение соединения. В соединении извлечения Doctrine будет предварительно выполнять 2 разных запроса, а затем просто гидрировать результат второго обратно в результат / данные первого.
Это иногда также называют ленивым соединением. Ленивые соединения — это поведение по умолчанию.
Вы можете изменить это поведение, изменив свои отношения с fetch="EAGER"
/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
Как сказал DarkMukke …
Вы пытались получить данные?
Добавление в ваши отношения fetch = «EAGER»
/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
private $ubicacionpaisid;
Это должно также извлечь и загрузить связанный объект.