Сортировка ActiveDataprovider по виртуальному атрибуту
Домовладельцы размещают вакансии. Работа выполняется торговцем. Домовладельцы рассматривают способ выполнения работы (по сути, они оценивают Торговца) путем обзора.
Домовладельцы и Торговец являются экземплярами модели "Пользователь", дифференцированной по идентификатору роли. Помимо "пользователя" я также создал модель "Работа" и "Обзор". Помимо заголовка и описания, обзор состоит из 6 различных рейтинговых объектов по шкале от 1 до 10 (гибкость, мышление, назначения, дружелюбие, соотношение цены и качества). Средний рейтинг работы - это сумма этих 6 объектов, деленная на 6.
Отзывы связаны с вакансиями через следующее отношение;
'job' => array(self::HAS_ONE, 'Job', 'review_id'),
Работа в Отзывы
'review' => array(self::BELONGS_TO, 'Review', 'review_id'),
Работа связана с домовладельцем (пользователем) через отношение:
'createUser' => array(self::BELONGS_TO, 'User', 'create_user_id'),
И Домовладелец (Пользователь) на его опубликованную работу:
'createdJobs' => array(self::HAS_MANY, 'Job', 'create_user_id'),
Работа связана с его Торговцем (Пользователем) отношением:
'carriedOutByUser' => array(self::BELONGS_TO, 'User', 'carried_out_by_user_id'),
И Торговец (Пользователь) на работу, которую он выполнил:
'completedJobs' => array(self::HAS_MANY, 'Job', 'carried_out_by_user_id'),
Хорошо, я хочу создать список торговцев и отсортировать их по рейтингу. Я создаю следующий поставщик данных в моем файле userController:
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider(User::model()->active()->isTradesman());
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
"active" и "isTradesman" - это области, которые фильтруют активных пользователей с ролью Tradesman.
В модели Review я создал метод:
public function getScore(){
return ($this->flexibility + $this->thinking + $this->appointments + $this->friendliness + $this->priceperformance + $this->quality)/6;
}
Итак, за работу я могу получить средний балл. Я также пытался получить этот счет через отношения как это:
'score' => array(self::BELONGS_TO,'Review','review_id','select' => 'SUM(score.flexibility+score.quality+score.appointments+score.priceperformance+score.thinking+score.friendliness)/6 as total')
Я также попробовал это через отношение STAT, но я не могу заставить его работать, поэтому я выбираю getScore()
методический подход.
Теперь я должен посчитать все эти оценки по принципу Tradesman и разделить их на количество выполненных им заданий. Затем я хочу отсортировать dataProvider в userController::actionIndex()
по этому значению. Можно ли это сделать, и если да, то как?
1 ответ
Кажется, что это не может быть сделано с использованием только php. Поэтому я изменил свой запрос с помощью метода поиска в модели User следующим образом.
$criteria = new CDbCriteria;
$criteria->alias = 'usr';
$criteria->join = 'LEFT JOIN bp_job AS job ON `job`.`carried_out_by_user_id` = `usr`.`id` LEFT JOIN bp_review AS r ON r.id = job.review_id ';
$criteria->select = '(SUM(r.flexibility + r.quality + r.appointments + r.priceperformance + r.thinking + r.friendliness) / 6) / count(r.id) as score';
$criteria->order = 'score DESC';