在Laravel中创建星级评定百分比

Jon*_*201 2 php percentage laravel eloquent laravel-4

我正在创建一个应用程序,买家可以根据项目对供应商进行评级,他们对"五分之一"(与星级)进行评级,但在供应商档案中,我希望将此数据显示为正常百分比.我已经得到了这个以下代码,但我想知道是否有更简洁的方法来做到这一点似乎我将不得不复制此代码5次(或为它创建一个函数)但我希望Laravel可能有更好的方法来做到这一点.

public function getSupplierProfile($group_id) {
    $group = Group::findOrFail($group_id);

    $data = new stdClass;

    $data->quality = new stdClass;
    $data->quality->query = SupplierRating::where('supplier_id', '=', $group->id);
    $data->quality->count = $data->quality->query->count();
    $data->quality->star_avg = $data->quality->query->avg('quality');
    $data->quality->avg = $data->quality->star_avg / ($data->quality->count * 6) * 100;

    dd($data->quality->avg); // debug

    return View::make('groups.view_profile', array('group' => $group));
}
Run Code Online (Sandbox Code Playgroud)

oll*_*ead 7

好的,所以你有一个星级评级系统,满分5星.我将在下面做一些假设/建议.

我假设你有一个评级表,每个评级只存储一行,如果没有,我建议设置一个.

<?php
class Rating extends \Eloquent
{

    protected $fillable = ['profile_id', 'user_id', 'rating'];

    public function user()
    {
        return $this->belongsTo('User', 'user_id');
    }

    public function profile()
    {
        return $this->belongsTo('Profile', 'profile_id');
    }

}
Run Code Online (Sandbox Code Playgroud)

此表将作为跟踪评级的好方法,如果在控制器中添加时间戳和某些逻辑,它还允许您限制评级.

你在这里有几个选择,它们如下.

  1. 在配置文件上有一列包含当前评级,并在添加新评级时更新.
  2. 有一个包含评级的摘要表,并在添加新评级时更新.
  3. 动态地解决它.

计算选项1的评级的方法与选项3相同,只是在添加新评级后才会运行它.拿下面的伪代码.

rating = score / ((total_ratings * 5) / 100)
Run Code Online (Sandbox Code Playgroud)

在此示例中,score所有评级和total_ratings的总和是评级计数.

您可以将其抽象为模型中的Laravel mutator而不是控制器中的代码,对于动态值,它将如下所示:

public function getRating()
{
    return Profile::join('ratings', 'ratings.profile_id', '=', 'profile.id')
        ->where('profile.id', $this->attributes['id'])
        ->select(DB::raw('SUM(ratings.rating) / ((COUNT(ratings.* * 5) / 100) as rating'))->pluck('rating');
}
Run Code Online (Sandbox Code Playgroud)

现在,当访问您的个人资料/供应商模型时,您可以像访问任何其他列一样访问评级属性.

如果您希望存储它,您可以使用相同的方法在控制器中进行处理.最终,你并不局限于任何特定的方法,我提到的有三个以上,但那些是基础的.

希望有所帮助.