web-dev-qa-db-ja.com

Doctrineの左結合ON条件と他の条件構文

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で見つかったページをチェックする方が良いですか?

33
juuga

これを試すことができます:

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

65
zapcost