Сортировка 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';
Другие вопросы по тегам