如何按平均评分排序

时间:2017-06-20 19:21:21

标签: laravel laravel-5 eloquent laravel-5.4

我试图按照产品评论中给出的平均评分来订购我的产品。

这是我的表格: 产品:ID,产品名称,价格,已批准 评论:ID,评论,评分,product_id_fk

如何将此更改为最高平均评分返回最低?

$products = Product::where('approved', '=', 1)->orderBy('productname');
return view('pages.search')->with('products', $products)

2 个答案:

答案 0 :(得分:0)

创建一个名为product_review_ratings的新表,其中包含

product_id
avg_rating

创建一个循环所有产品和总和评级的预定命令。保存到product_review_ratings表。

在ProductReviewRating模型中添加与Product

的关系
class ProductReviewRating extends Model
{
    public function product() {
        return $this->belongsTo(Product::class);
    }
}

现在您可以按评分排序。

$collection = ProductReviewRating::orderBy('avg_rating', 'desc')->get();

在视野中

@foreach ($collection as $rating)

    {$rating->product->name} - {$rating->avg_rating} <br>

@endforeach

预定命令的示例(假设您在产品型号中有评论关系)

foreach (Product::all() as $product) {

    ProductReviewRating::updateOrCreate(['product_id' => $product->id],[
        'product_id' => $product->id, 
        'avg_rating' => $product->reviews->pluck('rating')->avg()
    ]);

}

答案 1 :(得分:0)

简单方法(无需预定命令)是在评论上计算avg()并将结果与​​产品结合:

$products = DB::table('reviews')
            ->join('products', 'reviews.product_id', '=', 'products.id')
            ->select(DB::raw('avg(rating) as average, products.*'))
            ->groupBy('product_id')
            ->orderBy('average', 'desc')
            ->get();

在产品模型中创建一个方法,或者更好的产品存储库。