2012-06-12 35 views
4

我有一個奇怪的行爲,我將嘗試解釋。Yii奇怪的行爲:CGridView +組+

我正在構建一個報告系統,每個用戶都可以讓他們的個人資料,圖片或消息被其他用戶報告。

在後端我想顯示CGridView其中每個用戶出現在一行中的總次數已被報告。

要做到這一點,我將group添加到條件,它的效果很好。

但是,如果我想任何相關領域過濾視圖,我要補充with的標準和它的工作好與過濾或搜索,但結果總顯示不正確,顯示顯示1-2的15個結果當它應該顯示顯示1-2的2結果在報表中我有15行,但只有兩個用戶,也添加了一個不存在的分頁。

型號/ Report.php

public function relations() 
{ 
    return array(
     'reported' => array(self::BELONGS_TO, 'User', 'reported_id'), 
    ); 
} 

public function search() 
{ 
    $criteria = new CDbCriteria(); 
    $criteria->select = array(
     '*', 
     'count(*) as reports_count', 
    ); 
    $criteria->group = 't.reported_id'; 
    $criteria->with = array('reported'); 

    return new CActiveDataProvider($this, array(
     'criteria' => $criteria, 
     'sort'=>array(
      'attributes'=>array(
       'status_search'=>array(
        'asc'=>'reported.user_status_id', 
        'desc'=>'reported.user_status_id DESC', 
       ), 
       'reports_count' => array(
        'asc' => 'reports_count ASC', 
        'desc' => 'reports_count DESC', 
       ), 
       '*', 
      ), 
     ), 
     )); 
} 

更新:我找到了解決辦法使用連接,而不是與和選擇我需要的字段,而不是選擇所有的人都用*:

$criteria->select = array(
     't.id, t.reported_id', 
     'count(*) as reports_count', 
    ); 
$criteria->group = 't.reported_id'; 
$criteria->join = 'LEFT JOIN user u on u.id = t.reported_id'; 
+1

我有一個類似的問題,只有相反的方式。 'CGridView'顯示的結果比尋呼機少,我最終放了一個很大的限制。最終,這可能是'Yii' bug – adamors

回答

4

使用CActiveDataprovider時YII不使用在條件中建立的'with'來執行'totalItemCount',因此它會顯示不帶with的結果總數。我建議你添加手動連接條件來克服這個:)

$criteria->join = 'left join User u on u.id=t.reported_id' 

,並清除$基準 - >選擇和使用CActiveDataProvider的「totalItemCount」的方法。

+1

但是我想用'reports_count'顯示的是特定用戶數據庫中的總行數。 例如,我在數據庫中有15個用戶:user1已報告14次,user2有一次報告。 – Puigcerber

+2

我找到了方法,我將用解決方案更新我的問題。 – Puigcerber

+0

你的解決方案非常棒。我很高興你能得到答案:) – sucotronic

3

我在yii的論壇上發現它,由一個名爲「bennouna」的用戶發佈。 它爲我做了詭計。

public function groupedSearch() { 
    $criteria = new CDbCriteria; 
    $criteria->select = '…'; 
    $criteria->with = array(…); 
    $criteria->group = '…'; 
    $dp = new CActiveDataProvider($this, array('criteria'=>$criteria)); 
    $dp->setTotalItemCount(count($this->findAll($criteria))); 
    return $dp; 
}