Symfony2でDoctrineのクエリビルダーを使用して、エンティティを取得するクエリを作成しています。
私の現在のコードは次のようになります。
$repository = $this->getDoctrine()->getRepository('AaaBundle:Application');
$queryBuilder = $repository->createQueryBuilder('a');
$queryBuilder
->addSelect('u')
->addSelect('i')
->orderBy('a.created_date', 'DESC')
->leftJoin('a.created_by', 'u')
->leftJoin('a.installations', 'i')
//->where('i.page = :page')
//->setParameter('page', $found)
;
これで、インストールの有無に関係なく、これを使用してすべてのページを取得できます。しかし、私はそれらに参加したいだけです$found
ページが利用可能です(アプリのインストールはあるが、別のページにある場合、インストールは結合されません)。 where句の引用を解除すると、ページのインストールがあるアプリのみが表示されます。ページのインストールの有無にかかわらずすべてのアプリが必要です。
SQLでは、AND
を結合に追加することでこれを取得できます
LEFT JOIN installations i ON a.id = i.app AND i.page = :page
このようにして、ページにインストールされているアプリのインストール情報を取得しますが、他のページにインストールされているかまったくインストールされていないアプリの列でnull値を取得します。
Doctrineでこれを行う方法はありますか、または各アプリケーションのすべてのインストールを取得し、phpで見つかったページをチェックする方が良いですか?
これを試すことができます:
use Doctrine\ORM\Query\Expr;
->leftJoin('a.installations', 'i', Expr\Join::WITH, 'i.page = :page')
->setParameter('page', $page)
ドキュメントの関数leftJoinを参照してください: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#high-level-api-methods