Как выполнить запрос на объединение с помощью построителя запросов Symfony и Doctrine


У меня есть две сущности, которые связаны отношением 1:1, например: MyEntity.idRelatedEntity Я хочу создать запрос доктрины, в котором я могу извлекать данные из MyEntity в зависимости от значения из определенного столбца в RelatedEntity. Что-то вроде этого (конечно, это не работает):

$entity = $em
    ->getRepository('MyBundle:RelatedEntity')
    ->createQueryBuilder('e')
    ->leftJoin('MyBundle:RelatedEntity', 'r')
    ->where('r.foo = 1')
    ->getQuery()
    ->getResult();

Любая помощь была бы очень признательна:)

Author: viarnes, 2013-08-21

2 answers

$entity = $em
    ->getRepository('MyBundle:MyEntity')
    ->createQueryBuilder('e')
    ->join('e.idRelatedEntity', 'r')
    ->where('r.foo = 1')
    ->getQuery()
    ->getResult();

Также левое соединение здесь не имеет смысла (из-за предложения where, которое заставит его работать как внутреннее соединение)

 17
Author: Uriziel, 2013-08-21 12:46:36

Обратите внимание, что вы должны написать этот запрос в своем MyEntityRepository

public function getMyEntityWithRelatedEntity($parameter) 
{
    $query = $this->createQueryBuilder('e')
        ->addSelect('r') // to make Doctrine actually use the join
        ->leftJoin('e.relatedEntity', 'r')
        ->where('r.foo = :parameter')
        ->setParameter('parameter', $parameter)
        ->getQuery();

    return $query->getResult();
}

А затем используйте его в своем контроллере/службе:

$manager = $this->getDoctrine()->getManager();
$results = $manager->getRepository(MyEntity::class)->getMyEntityWithRelatedEntity(1);
 14
Author: sf_tristanb, 2018-03-27 10:37:33