0

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

关系是

'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';

在查看日志时,我可以看到这会生成正确的查询,但是我无法访问总和的值。这是正确的做法吗?如果是,那么我如何访问这个新列?

4

1 回答 1

0

那么我怎样才能访问这个新列呢?

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

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

更新

正如阿里之前所说,需要在model.xml中定义这个属性。

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)分组的值数组。查看文档

现在您执行下一步将它们加入模型:

$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以将它们与原始模型数据连接起来,以便在网格中显示。

于 2014-12-26T12:30:55.743 回答