web-dev-qa-db-fra.com

Comment effectuer une requête de jointure en utilisant Symfony et Doctrine Query Builder

J'ai deux entités qui sont connectées via une relation 1: 1, par exemple: MyEntity.idRelatedEntity Je veux créer une requête Doctrine où je peux récupérer des données de MyEntity en fonction d'une valeur d'une certaine colonne dans RelatedEntity. Quelque chose comme ça ( ça ne marche pas bien sûr):

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

Toute aide serait très appréciée :)

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

La jointure gauche également n'a aucun sens ici (en raison de la clause where qui la fera fonctionner comme la jointure interne)

17
Uriziel

Notez que vous devez écrire cette requête dans votre 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();
}

Et puis utilisez-le dans votre contrôleur/service:

$manager = $this->getDoctrine()->getManager();
$results = $manager->getRepository(MyEntity::class)->getMyEntityWithRelatedEntity(1);
14
sf_tristanb