DoctrineのQueryBuilderを使用して非常に複雑なクエリを作成しようとしています(Doctrine 2.2を使用しています)。モデルには、Distributor
クラスとDistributorVisit
1対多の関係を持つクラスがあります。ディストリビューターが担当者によって訪問されるたびにDistributorVisit
、訪問日とともに新しい行がテーブルに追加されます。2つのテーブルのER図はここにあります。
ここで、最後の訪問日でディストリビューターをフィルタリングできるようにしたいと思います。したがって、ユーザーは日付範囲(最後の訪問元と最後の訪問)を入力し、最後の訪問日がこれら2つの日付の間にあるディストリビューターがリストされます。フィルターで行う条件付きクエリが他にもたくさんあるため、Doctrineのクエリビルダーを使用しています。このシナリオでは、オブジェクト指向のアプローチが最適であることがわかりました。これが私がDistributorRepository
クラスでしたことです:
$qb = $this->getEntityManager()->createQueryBuilder()
->select('o')
->from('MyBundle:Distributor', 'o');
// Lots of 'andWhere's here
$qbv = $this->getEntityManager()->createQueryBuilder();
$qb->andWhere($qb->expr()->between(
$qbv->select($qbv->expr()->max('v.visitDate'))
->from('MyBundle:DistributorVisit', 'v')
->join('MyBundle:Distributor', 'o2',
Join::WITH,
$qbv->expr()->andX(
$qbv->expr()->eq('o2.id', 'v.distributorId'),
$qbv->expr()->eq('o2.id', 'o.id')
))
->getDQL(),
$filter->getLastVisitFrom()->getTimestamp(),
$filter->getLastVisitTo()->getTimestamp()
));
これにより、次のエラーが発生します。
[Syntax Error] line 0, col 83: Error: Expected Literal, got 'SELECT'
これは、クエリビルダーがサブ選択がリテラルであると想定しているためだと思いますが、サブクエリの結果はリテラルである必要があります。クエリビルダーがそれに応じて括弧を追加しないためでしょうか?
どうもありがとうございました。