如何在Doctrine 2中按计数排序?

时间:2011-05-14 08:18:33

标签: sql-order-by doctrine-orm query-builder

我正在尝试按字段(年份)对我的实体进行分组并对其进行计数。

代码:

public function countYear()
{
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('b.year, COUNT(b.id)')
        ->from('\My\Entity\Album', 'b')
        ->where('b.year IS NOT NULL')
        ->addOrderBy('sclr1', 'DESC')
        ->addGroupBy('b.year');
    $query = $qb->getQuery();
    die($query->getSQL());
    $result = $query->execute();
    //die(print_r($result));
    return $result;
}

我似乎无法说COUNT(b.id) AS count,因为它会出错,而且 我不知道该用什么作为addOrderby(???, 'DESC')值?

4 个答案:

答案 0 :(得分:44)

从v2.3.0或更低版本开始,表达式需要很多错误和解决方法:

  1. order by子句不支持表达式,但您可以将带有表达式的字段添加到select并按顺序排序。所以值得重复的是,Tjorriemorrie自己的解决方案确实有效:

    $qb->select('b.year, COUNT(b.id) AS mycount')
       ->from('\My\Entity\Album', 'b')
       ->where('b.year IS NOT NULL')
       ->orderBy('mycount', 'DESC')
       ->groupBy('b.year');
    
  2. 教义在选择表达式中扼杀了平等(例如=LIKEIS NULL)。对于这些情况,我发现的唯一解决方案是使用subselect或self-join:

    $qb->select('b, (SELECT count(t.id) FROM \My\Entity\Album AS t '.
                    'WHERE t.id=b.id AND b.title LIKE :search) AS isTitleMatch')
       ->from('\My\Entity\Album', 'b')
       ->where('b.title LIKE :search')
       ->andWhere('b.description LIKE :search')
       ->orderBy('isTitleMatch', 'DESC');
    
  3. 要从结果中取消附加字段,可以将其声明为AS HIDDEN。通过这种方式,您可以按顺序使用它,而不会在结果中使用它。

    $qb->select('b.year, COUNT(b.id) AS HIDDEN mycount')
       ->from('\My\Entity\Album', 'b')
       ->where('b.year IS NOT NULL')
       ->orderBy('mycount', 'DESC')
       ->groupBy('b.year');
    

答案 1 :(得分:8)

使用COUNT(b.id) AS count时出现的错误是什么?可能是因为count是保留字。尝试COUNT(b.id) AS idCount或类似。

或者,尝试$qb->addOrderby('COUNT(b.id)', 'DESC');

你的数据库系统是什么(mysql,postgresql,...)?

答案 2 :(得分:2)

如果您希望Repository方法返回实体,则无法使用->select(),但您可以使用->addSelect()隐藏选择。

$qb = $this->createQueryBuilder('q') ->addSelect('COUNT(q.id) AS HIDDEN counter') ->orderBy('counter'); $result = $qb->getQuery()->getResult();

$result将是一个实体类对象。

答案 3 :(得分:-2)

请尝试使用此代码进行ci 2 + doctrine 2

$where = " ";

$order_by = " ";
$row = $this->doctrine->em->createQuery("select a from company_group\models\Post a " 
            .$where." ".$order_by."")
            ->setMaxResults($data['limit'])
            ->setFirstResult($data['offset'])
            ->getResult();`