簡體   English   中英

使用Yii中的CActiveRecord計算相關模型中的列總和

[英]Calculate the sum of a column in related models using CActiveRecord in Yii

我有2個表:user(id,email,...)和task(id,uid,COMPLAINTS,..)

關系是

'tasks' => array(self::HAS_MANY, 'Task', 'uid'),

我正在網格視圖中顯示所有用戶,並希望添加一列,以顯示屬於該用戶的任務的投訴列的總和。 我可以通過User模型中的STAT關系實現此目的:

'complaints'=>array(self::STAT, 'Task', 'uid', 'select'=>'SUM(complaints)', 'defaultValue'=>'0'),

但是,當在網格視圖中顯示時,這將對數據庫創建很多查詢。 但這可以在單個查詢中完成:

select user.*, sum(task.complaints) 
from user 
left join task 
on user.id=task.uid 
group by user.id

所以我想出了這個:

In the action method of the controller:
$criteria = new CDbCriteria;
$criteria->with = array('tasks'=>array('select'=>'sum(complaints) AS compl'));
$criteria->group = 't.id';

我可以看到在查看日志時這會生成正確的查詢,但是我無法訪問總和的值。 這是正確的做法嗎? 如果是,那么我如何訪問此新列?

那我該如何訪問這個新列呢?

在GridView中,您只需要添加此列:

$this->widget('zii.widgets.grid.CGridView', array(  
    'dataProvider'=>$dataProvider,  
    'columns'=>array(
        'id',
        'group',
        'tasks',
 ...

更新資料

如Ali先前所述,您需要在模型中定義此屬性。

class User {
  public $complain;
  ...
}

然后通過sql為其分配值:

$sql->db->createCommand('SELECT SUM(complaints) AS compl, id FROM <table_name>.t GROUP BY t.user_id');
$dataReader=$sql->queryAll(); 

假定返回按用戶(user_id)分組的值的數組。 參見docs

現在,您執行下一步以將它們加入模型:

$models=User::model()->findAll();
foreach($dataReader as $row)
{  
   $models[$row['id']]->complain=$row['compl'];
}
//the resulting $models you leverage for displaying in GridView.

或者,您可以將這些數據$row['compl']ArrayDataProvider中,以將它們與原始模型數據結合起來,也可以在網格中顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM