我试图按照产品评论中给出的平均评分来订购我的产品。
这是我的表格: 产品:ID,产品名称,价格,已批准 评论:ID,评论,评分,product_id_fk
如何将此更改为最高平均评分返回最低?
$products = Product::where('approved', '=', 1)->orderBy('productname');
return view('pages.search')->with('products', $products)
答案 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();
在产品模型中创建一个方法,或者更好的产品存储库。