我正在创建一个应用程序,买家可以在其中根据项目对他们的供应商进行评分,他们以“满分五分”(星号)为基础对他们进行评分,但是在供应商资料中我想将此数据显示为正常百分比。我已经让它与下面的代码一起工作,但我想知道是否有更简洁的方法来执行此操作,因为我似乎必须将这段代码复制 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));
}
最佳答案
好的,所以您有一个基于星级的评级系统(最高 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');
}
}
此表将作为跟踪评级的好方法,此外,如果您在 Controller 中添加时间戳和一些逻辑,它还允许您限制评级。
这里有几个选项,如下所示。
- 在配置文件中有一列包含当前评级,并在添加新评级时更新。
- 有一个包含评级的汇总表,并在添加新评级时更新。
- 动态计算。
计算选项 1 评级的方法与选项 3 相同,只是您只在添加新评级后才运行它。采用以下伪代码。
rating = score / ((total_ratings * 5) / 100)
在此示例中,score
是所有评分的总和,total_ratings 是评分的计数。
与其将代码放在 Controller 中,不如将其抽象为模型中的 Laravel 修改器,动态值如下所示:
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');
}
现在,当访问您的个人资料/供应商模型时,您可以像访问任何其他列一样访问评分属性。
如果您想要存储它,您可以使用相同类型的方法在 Controller 中进行处理。最终你不局限于任何特定的方法,我提到的不止三种,但这些是基本方法。
希望对您有所帮助。
关于php - 在 Laravel 中创建星级百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23383650/