2011-05-14 51 views
10

我试图按字段(年)对实体进行分组并对其进行计数。如何通过在教义2计数?

代码:

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')值使用什么?

回答

8

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

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

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

+0

我不认为数据库与DBAL有关系吗?无论如何,它得到它的工作:'('\ My \ Entity \ Album','b') - > $ qb-> select('b.year,COUNT(b.id)AS mycount') - > where 'b.year IS NOT NULL') - > orderBy('mycount','DESC') - > groupBy('b.year');'感谢您指出关键字问题。 – Tjorriemorrie 2011-05-14 09:07:42

+1

您的替代方法不起作用。此外,如果你想重复使用你的结果作为子查询 - (例如。orderBy)添加COUNT选择不起作用。 – wdev 2011-11-01 14:56:14

-2

请尝试此代码CI 2 + 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();` 
37

有实现的表达顺序V2.3.0或低于所要求的许多错误和解决方法:

  1. 顺序by子句不支持表达式,但是您可以添加一个带有表达式的字段到select和order by。所以这是值得重申的是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)在选择表达扼流圈上的平等。对于这些情况下,我已经找到了唯一的解决办法是使用子查询或自连接:

    $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'); 
    
+3

谢谢!点3是我正在寻找:) – SERPRO 2013-06-27 10:55:28

+2

作为隐藏是一个奇妙的提示,谢谢 – frak 2013-09-05 09:53:18

+0

为HIDDEN +1。神奇的提示。学说不断在我的对象映射中返回结果。 – 2014-09-09 08:30:33

0

如果你希望你的库方法返回一个实体,你不能使用->select(),但你可以使用->addSelect()有一个隐藏的选择。

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

$result将一个实体类对象。