我有2张桌子: 用户(身份证,电子邮件,...)和 任务(ID,UID,投诉,..)
关系是
'tasks' => array(self::HAS_MANY, 'Task', 'uid'),
我正在网格视图中显示所有用户,并希望添加一列,显示属于该用户的任务的投诉列的总和。 我能够在用户模型中使用此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';
我可以看到这会在查看日志时生成正确的查询,但是我无法访问总和的值。 这是正确的做法吗?如果是,那么我该如何访问这个新列呢?
答案 0 :(得分:0)
然后我该如何访问这个新列?
在GridView中,您只需添加此列:
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'columns'=>array(
'id',
'group',
'tasks',
...
正如阿里先前所说,你需要在模型中定义这个属性。
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(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 ,以便将它们与原始模型数据相结合,以便在网格中显示。