2014-06-26 39 views
1

我有一個問題,我的剋星:SQL/DQL 我有一個實體:樣式和實體投票。樣式可以有很多投票(如你所想象的),一個投票只與一個樣式鏈接。學說按指數搜索表

我現在想要搜索的投票少於特定金額(這是用戶輸入,但假設它是5)的樣式。這是我與QueryBuilder的

$qb = $this->createQueryBuilder('s'); 
$qb 
    ->select("s") 
    ->join('s.votes', 'v') 
    ->addSelect("COUNT(v.id) as voteCount") 
    ->where("voteCount < ?1") 
    ->orderBy('voteCount', "DESC") 
    ->setMaxResults(3) 
    ->setFirstResult(0) 
    ->groupBy('s.id') 
    ->setParameter(1, 5); 

$query = $qb->getQuery(); 
$result = $query->getResult(); 

使用一次,我嘗試執行查詢的代碼,它基本上說,我voteCount未在where子句中已知的。這是確切的錯誤信息

An exception occurred while executing 'SELECT s0_.active AS active0, s0_.views AS views1, s0_.description AS description2, s0_.name AS name3, s0_.id AS id4, s0_.updated AS updated5, s0_.created AS created6, COUNT(v1_.id) AS sclr7, s0_.battle_id AS battle_id8, s0_.user_id AS user_id9, s0_.voucher_id AS voucher_id10 FROM Style s0_ INNER JOIN Vote v1_ ON s0_.id = v1_.style_id WHERE sclr7 < ? GROUP BY s0_.id ORDER BY sclr7 DESC LIMIT 3 OFFSET 0' with params [1]:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sclr7' in 'where clause'

我做錯了什麼?我如何搜索vor voteCount?

+0

$ QB->其中( 「voteCount <1?」);使用$ qb-> where(「COUNT(v.id)<?1」);只是爲了測試 – AlixB

+0

你可以看到http://stackoverflow.com/a/16938758/3469608,希望它會幫助 – AlixB

回答

2

集合函數的條件,例如sumcount應放在having子句中。

$qb = $this->createQueryBuilder('s'); 
$qb->select("s"); 
$qb->join('s.votes', 'v'); 
$qb->addSelect("COUNT(v.id) as voteCount"); 
$qb->orderBy('voteCount', "DESC"); 
$qb->setMaxResults(3); 
$qb->setFirstResult(0); 
$qb->groupBy('s.id'); 
$qb->having("count(v.id) < ?1"); //changed from where 
$qb->setParameter(1, 5); 
$query = $qb->getQuery(); 
$result = $query->getResult(); 
+0

謝謝你這個工作,很好。現在你說了,它響了。 :) – Loki

0

您不能在WHERE子句中引用列別名。

變化

$qb->where("voteCount < ?1"); 

$qb->where("COUNT(v.id) < ?1"); 
+0

這不適合我。現在它告訴我 一般錯誤:1111無效的使用組功能 但解決方案正常工作。但謝謝你的努力:) – Loki