У меня есть 2 таблицы:
пользователь (идентификатор, адрес электронной почты, …) и
Задача (идентификатор, UID, ЖАЛОБЫ, ..)
Отношение
'tasks' => array(self::HAS_MANY, 'Task', 'uid'),
Я отображаю всех пользователей в виде сетки и хочу добавить столбец, который показывает сумму столбца жалоб для задач, принадлежащих пользователю.
Я смог добиться этого с помощью этого отношения STAT в модели User:
'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',
...
Как сказал Али ранее, вам нужно определить это свойство в модели.
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 объединить их с исходными данными модели для отображения в сетке.
Других решений пока нет …