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

时间:2014-04-30 08:49:20

标签: php laravel laravel-4 eloquent percentage

我正在创建一个应用程序,买家可以根据项目对他们的供应商进行评级,他们根据五分之一的评分对他们进行评级。基础(有明星)然而在供应商档案中我想以正常百分比显示这些数据。我已经得到了这个以下代码,但我想知道是否有更简洁的方法来做到这一点似乎我将不得不复制此代码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));
}

1 个答案:

答案 0 :(得分: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');
    }

}

此表将作为跟踪评级的好方法,而且如果您在控制器中添加时间戳和某些逻辑,它可以限制评级。

您在这里有几个选项,它们如下所示。

  1. 在配置文件中包含一个包含当前评级的列,并在添加新评级时更新。
  2. 有一个包含评级的摘要表,并在添加新评级时更新。
  3. 动态地解决它。
  4. 计算选项1的评级的方法与选项3相同,除非您只在添加新评级后才运行它。请使用以下伪代码。

    rating = score / ((total_ratings * 5) / 100)
    

    在此示例中,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');
    }
    

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

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

    希望有所帮助。