2011-05-14 54 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將一個實體類對象。