Php 创建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

我正在创建一个应用程序,买家可以根据一个项目对其供应商进行评分,他们根据“五分制”对其进行评分(带星星),但是在供应商档案中,我希望以正常百分比显示此数据。我已经将此代码用于以下代码,但我想知道是否有更干净的方法来执行此操作,因为我似乎必须将此代码复制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));
}

好的,你有一个五星级的评级系统。下面我将提出一些假设/建议

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

<?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');
}