web-dev-qa-db-ja.com

SymfonyとDoctrine Query Builderを使用して結合クエリを実行する方法

1対1の関係で接続されている2つのエンティティがあります。例:MyEntity.idRelatedEntity Doctrineクエリを作成します。ここで、MyEntityの特定の列の値に応じて、RelatedEntityからデータを取得できます。このような(もちろん機能しません):

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

どんな助けでも大歓迎です:)

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

また、左結合はここでは意味をなしません(内部結合のように機能させるwhere句のため)

17
Uriziel

このクエリは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
sf_tristanb