Рассчитать сумму столбца в связанных моделях с помощью CActiveRecord в Yii

У меня есть 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';

Я вижу, что это создает правильный запрос при просмотре журналов, однако я не могу получить доступ к значению для суммы.
Это правильный способ сделать это? Если это так, то как я могу получить доступ к этому новому столбцу?

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_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 объединить их с исходными данными модели для отображения в сетке.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]