按虚拟属性对ActiveDataprovider进行排序

时间:2014-01-02 08:14:01

标签: yii cactivedataprovider

房主发布职位。工作由Tradesman执行。房主通过审查来审查工作的执行方式(基本上是对商人的评价)。

房主和商人都是模型的实例用户通过角色ID区分,除了用户我还创建了一个Job和Review模型。 评论包括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'),

好的,我想要做的是创建一个Tradesman列表,并根据他们的评级对它们进行排序。 我在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()方法。

现在我必须以匠人为基础计算所有这些分数,并将它们除以他/她执行的工作数量。然后我想通过此值对userController::actionIndex()中的dataProvider进行排序。可以这样做,如果是这样,怎么办?

1 个答案:

答案 0 :(得分:0)

似乎这不能仅使用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';