我想通過產品評論中給出的評分的平均值來訂購我的產品。如何以平均評分排序
這裏是我的表: 產品:編號,產品名稱,價格,覈定 評論:身份證,審查,評級,product_id_fk
我將如何改變這種對最高平均收視返回最低的?
$products = Product::where('approved', '=', 1)->orderBy('productname');
return view('pages.search')->with('products', $products)
我想通過產品評論中給出的評分的平均值來訂購我的產品。如何以平均評分排序
這裏是我的表: 產品:編號,產品名稱,價格,覈定 評論:身份證,審查,評級,product_id_fk
我將如何改變這種對最高平均收視返回最低的?
$products = Product::where('approved', '=', 1)->orderBy('productname');
return view('pages.search')->with('products', $products)
創建一個名爲product_review_ratings新表包含
product_id
avg_rating
創建的調度命令,通過所有產品和總和avrage等級循環。保存到product_review_ratings表。
在ProductReviewRating模型添加到產品
class ProductReviewRating extends Model
{
public function product() {
return $this->belongsTo(Product::class);
}
}
現在的關係可以通過rating.`
$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()
]);
}
最簡單的方式(沒有調度命令需要)是計算在評論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();
使這個方法對您的產品型號,或更好但是,產品庫。
收視率在哪裏平均? – detinu20
Upps!我的錯。它是平均值(評級)而不是平均值(*)。回答編輯。 –
SQLSTATE [42000]:語法錯誤或訪問衝突:1055 SELECT列表的表達式#2不在GROUP BY子句中,並且包含非聚集列'products.products.id',它在功能上不依賴於GROUP BY子句中的列;這與sql_mode = only_full_group_by不兼容(SQL:選擇平均產品avg(ratings),產品。*來自'reviews'內部連接'產品'評論'.'product_id' ='評論'''id'產品ID 'order by'average' desc) - 是我得到的代碼錯誤。有任何想法嗎? – detinu20
想知道什麼時間表的命令會循環通過? – detinu20
@ detinu20你知道如何做出命令嗎?解決方案來了! –
@ detinu20編輯我的回答 –