0

房主发布工作。工作由 Tradesman 执行。房主通过审查来审查工作的执行方式(基本上他们对商人进行评级)。

Homeowners 和 Tradesman 都是由角色 id 区分的模型 User 的实例,除了 User 我还创建了一个 Job 和一个 Review 模型。评论除了标题和描述外,还包括 6 个不同的评级实体,等级为 1 - 10(灵活性、思维、约会、友好性、性价比和质量)。Job 的平均评分是这 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 进行排序。这可以做到吗?如果可以,怎么做?

4

1 回答 1

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';
于 2014-01-07T14:22:54.100 回答