2012-03-23 113 views
2
$criteria=new CDbCriteria(); 
$criteria->with = array('reviewCount', 'category10', 'category20', 'category30', 'town'); 
$criteria->select = 't.id,business,street,postalCode,contactNo,checkinCount,count(tbl_abc.id) as spcount'; 
$criteria->join = 'left join tbl_abc on t.id=tbl_abc.businessId'; 
$criteria->group = 't.id'; 
$criteria->order = 'spcount DESC'; 
$criteria->condition='spcount>1'; 
$bizModel = new CActiveDataProvider(Business::model(), array(
    'criteria' => $criteria 
)); 

我得到這個錯誤:條件在Yii框架標準PHP的

Column not found: 1054 Unknown column 'spcount' in 'where clause'

如果我省略了查詢通過spcount工作正常&訂單業務的條件。那麼,如何重寫這個查詢,讓我得到所有的賬號超過1的企業?

回答

2

據我所知,你不能在WHERE部分(proof link)引用別名。刪除的條件線和添加以下內容:

$criteria->having = 'COUNT(tbl_abc.id) > 1'; 

UPDATE

CActiveDataProvider accepts finder instance,所以你需要一個模型範圍:

<?php 
class Business extends CActiveRecord 
{ 
    public function scopes() 
    { 
    return array(
     'hasSpcount' => array(
     'with' => array('reviewCount', 'category10', 'category20', 'category30', 'town'), 
     'select' => 't.id,business,street,postalCode,contactNo,checkinCount,count(tbl_abc.id) as spcount', 
     'join' => 'left join tbl_abc on t.id=tbl_abc.businessId', 
     'group' => 't.id', 
     'order' => 'spcount DESC', 
     'having' => 'COUNT(tbl_abc.id) > 1', 
    ), 
    ); 
    } 
} 

// usage 
$provider = new CActiveDataProvider(Business::model()->hasSpcount()); 

希望這個作品

+0

有工作。但是這有一個問題。 $ bizModel-> getTotalItemCount()是613,這實際上是忽略過濾器spcount> 1的記錄總數。但否則顯示過濾結果。因爲我使用Clistview所以它創建分頁問題。當它只有7-8個記錄時,它顯示7頁的分頁。 – iThink 2012-03-23 18:48:36

+0

@iThink你不能重寫'getTotalItemCount'來應用過濾器嗎? – galymzhan 2012-03-23 19:09:21

+0

查看不使用過濾器,即$ criteria-> having ='spcount> 1'getTotalItemCount = 163。並且使用filter getTotalItemCount應該是8,因爲它顯示8條記錄,但getTotalItemCount是163 – iThink 2012-03-23 19:24:57

0

也許你可以使用子選擇查詢。

例如在你標準選擇部分對象:

$criteria->select = 't.id,business,street,postalCode,contactNo,checkinCount,(select count(id) from tbl_abc where t.id=businessId) as spcount'; 

或者作爲內連接(其也可以包含 「其中spcount> 1」 狀態):

$criteria->join = 'join (select businessId, count(*) as spcount from tbl_abc) abc on t.id=abc.businessId and abc.spcount>1'; 

在這兩種情況下,spcount也可以在查詢的where子句中使用。此外,由於spcount現在是主表的每一行(「t」)的單個值,所以「group by t.id」不再是必需的。

希望這有助於