【问题标题】:How to use "distinct on" with doctrine?如何将“区别开”与教义一起使用?
【发布时间】:2014-01-15 07:24:47
【问题描述】:

我尝试在学说中使用“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 查询。

【问题讨论】:

    标签: php symfony doctrine-orm distinct distinct-on


    【解决方案1】:

    此回复适用于在类似情况下仍在寻找解决方案的人。 如果您需要示例“DISTINCT”,您可以使用:

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

    但如果您想要“DISTINCT ON”,您应该使用 Native SQL 而不是 Query Builder,请在此处查看手册:Doctrine Native SQL

    【讨论】:

      【解决方案2】:

      只需删除on 字:

      $queryBuilder->select('distinct r.parentId')
                   ->orderBy('r.parentId')
                   ->orderBy('r.date', 'DESC');
      

      【讨论】:

      • 但是我需要一个 distinct on 而不是一个简单的 distinct!我还发现使用 select() 我们需要使用 from()。
      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 2019-01-30
      • 1970-01-01
      • 2019-10-11
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多