1

doctrine で「distinct on」を使用しようとしましたが、次のエラーが発生しました。

エラー: 既知の関数が予期されていましたが、「オン」になりました

class Report extends EntityRepository
{
    public function findForList() {
        $queryBuilder = $this->createQueryBuilder('r');
        $queryBuilder->select('distinct on (r.parentId)')
                     ->orderBy('r.parentId')
                     ->orderBy('r.date', 'DESC');

        return $queryBuilder->getQuery()->getResult();
    }
}

次のクエリを実装するにはどうすればよいですか?

select distinct on (r.parent_id)
    r.parent_id,
    r.id,
    r.name
from frontend.report r
order by r.parent_id, r.date desc;

どうやらクエリビルダーでこれを行うことはできないようです。さまざまな方法でクエリを書き直そうとしました。

select * from frontend.report r
where 
r.id in (
select distinct 
   (select r3.id from frontend.report r3
   where r3.parent_id = r.parent_id 
   order by r3.date desc limit 1) AS id
from frontend.report r2);

しかし教義は LIMIT をサポートしていません:

public function findForList() {
    $qb3 = $this->_em->createQueryBuilder();
    $qb3->select('r3.id')
        ->from('MyBundle:frontend\report', 'r3')
        ->where('r3.parentId = r2.parentId')
        ->orderBy('r3.date', 'DESC')
        //->setMaxResults(1)
            ;

    $qb2 = $this->_em->createQueryBuilder();
    $qb2->select('(' . $qb3->getDql() . ' LIMIT 1)')
        ->from('MyBundle:frontend\report', 'r2')
        ->distinct(); // groupBy('r2.parentId')

    $queryBuilder = $this->createQueryBuilder('r');
    $queryBuilder->where(
        $queryBuilder->expr()->in('rlt.id', $qb2->getDql())
    );

    return $queryBuilder->getQuery()->getResult();
}

唯一の解決策は、ネイティブ SQL クエリを使用することだと思います。

4

2 に答える 2

-1

この回答は、同様のケースで解決策をまだ探している人向けです。サンプル「DISTINCT」が必要な場合は、次を使用できます。

$queryBuinder->select('parentId')
             ->distinct('parentId');

ただし、「DISTINCT ON」が必要な場合は、Query Builder の代わりに Native SQL を使用する必要があります。こちらのマニュアルを参照してください: Doctrine Native SQL

于 2016-10-20T18:50:45.200 に答える
-2

on単語を削除するだけです:

$queryBuilder->select('distinct r.parentId')
             ->orderBy('r.parentId')
             ->orderBy('r.date', 'DESC');
于 2014-01-15T08:12:06.393 に答える