2017-06-20 100 views
0

我想通過產品評論中給出的評分的平均值來訂購我的產品。如何以平均評分排序

這裏是我的表: 產品:編號,產品名稱,價格,覈定 評論:身份證,審查,評級,product_id_fk

我將如何改變這種對最高平均收視返回最低的?

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

回答

0

創建一個名爲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() 
    ]); 

} 
+0

想知道什麼時間表的命令會循環通過? – detinu20

+0

@ detinu20你知道如何做出命令嗎?解決方案來了! –

+0

@ detinu20編輯我的回答 –

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(); 

使這個方法對您的產品型號,或更好但是,產品庫。

+0

收視率在哪裏平均? – detinu20

+0

Upps!我的錯。它是平均值(評級)而不是平均值(*)。回答編輯。 –

+0

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