Php 创建Laravel中的星级百分比
我正在创建一个应用程序,买家可以根据一个项目对其供应商进行评分,他们根据“五分制”对其进行评分(带星星),但是在供应商档案中,我希望以正常百分比显示此数据。我已经将此代码用于以下代码,但我想知道是否有更干净的方法来执行此操作,因为我似乎必须将此代码复制5次(或为其创建一个函数),但我希望Laravel可能有更好的方法来执行此操作Php 创建Laravel中的星级百分比,php,laravel,laravel-4,eloquent,percentage,Php,Laravel,Laravel 4,Eloquent,Percentage,我正在创建一个应用程序,买家可以根据一个项目对其供应商进行评分,他们根据“五分制”对其进行评分(带星星),但是在供应商档案中,我希望以正常百分比显示此数据。我已经将此代码用于以下代码,但我想知道是否有更干净的方法来执行此操作,因为我似乎必须将此代码复制5次(或为其创建一个函数),但我希望Laravel可能有更好的方法来执行此操作 public function getSupplierProfile($group_id) { $group = Group::findOrFail($grou
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));
}
好的,你有一个五星级的评级系统。下面我将提出一些假设/建议 我假设您有一个评级表,每个评级只存储一行,如果没有,我建议设置一行
<?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');
}
}
在本例中,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');
}
现在,在访问配置文件/供应商模型时,您可以像访问任何其他列一样访问rating属性
如果您想将其存储,您可以使用相同的方法在控制器中进行计算。最终,您不局限于任何特定的方法,我提到的方法不止三种,但这些都是基本方法
希望能有所帮助。您正在将
$group
传递到视图,那么为什么所有$data
都要传递给视图?目前正在研究如何最好地将实际百分比数据传递到视图,以便能够轻松显示,我将在计算完后将所有处理移到group或SupplierRating模型中。对我来说,这是最简单的方法,就是创建一个属性$data,在_construct函数中填充您需要的任何内容。您考虑过可伸缩性吗?您如何为供应商列表提供这些评级?您现在可以查询列表中每个供应商的评级表。您最好在数据库端进行计算,然后才为该百分比设置访问器。@deczo在任何时候都不会在有很多供应商的列表中显示这些值,这是我们的应用程序明确不希望看到的。如果出于某种原因,我们开始列出它们,我会在suppliers数据库表中缓存这些值。
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');
}