我有一张表可以返回产品类别。他们是另一个表(称为inventory_review),其中包含客户留给产品的评论。我如何在实际类别的foreach循环中循环浏览每个评论以查找该特定产品的平均评级。
我可以在产品页面上轻松完成,只需在声明中使用AVG,但在类别上它只显示第一次评论。
Mysql的
$category = Inventory::select('inventory_review.rating','inventory_images.image', 'inventory.id' , 'inventory.sku', 'inventory.name', 'inventory.price', 'inventory_categories.category')
->join('inventory_categories', 'inventory.sku', '=', 'inventory_categories.sku')
->leftJoin('inventory_images', 'inventory.sku', '=', 'inventory_images.sku')
->leftJoin('inventory_review', 'inventory.id', '=', 'inventory_review.inventory_id')
->where('inventory_categories.category', 'LIKE', '%'.$cat.'%')
->where('inventory.active', '=', 1)
->where('inventory.stock_quantity', '>', 2)
->groupby('inventory.id')
->paginate(16);
所以基本上会发生什么,它会遍历所有与该类别相匹配的产品,并且只返回产品的第一个评论评级。我知道我可能需要循环一些但不确定是什么。
@if($inventory->rating > 0)
@for ($i=1; $i <= 5 ; $i++)
@if($i <= $inventory->rating)
<i class="fa fa-star"></i>
@else
<i class="fa fa-star-o"></i>
@endif
@endfor
@endif
答案 0 :(得分:1)
您也应该在这里使用AVG()函数。 (不知道你正在使用的课程,但我会猜这样的事情)
$category = Inventory::select('AVG(inventory_review.rating) AS averageRating','inventory_images.image', 'inventory.id' , 'inventory.sku', 'inventory.name', 'inventory.price', 'inventory_categories.category')
->join('inventory_categories', 'inventory.sku', '=', 'inventory_categories.sku')
->leftJoin('inventory_images', 'inventory.sku', '=', 'inventory_images.sku')
->leftJoin('inventory_review', 'inventory.id', '=', 'inventory_review.inventory_id')
->where('inventory_categories.category', 'LIKE', '%'.$cat.'%')
->where('inventory.active', '=', 1)
->where('inventory.stock_quantity', '>', 2)
->groupby('inventory.id')
->paginate(16);
由于您最后使用的是GROUP BY,因此如果您未指定每项评论的评分(AVG(),MAX(),MIN()),则只会返回第一个评论评分,SUM()或你想要完成的事情。)
答案 1 :(得分:0)
接受Niklas的回答,但必须编辑它以适合Laravel文档
$category = Inventory::select(DB::raw('AVG(inventory_review.rating) AS averageRating'),'inventory_images.image', 'inventory.id' , 'inventory.sku', 'inventory.name', 'inventory.price', 'inventory_categories.category')
->join('inventory_categories', 'inventory.sku', '=', 'inventory_categories.sku')
->leftJoin('inventory_images', 'inventory.sku', '=', 'inventory_images.sku')
->leftJoin('inventory_review', 'inventory.id', '=', 'inventory_review.inventory_id')
->where('inventory_categories.category', 'LIKE', '%'.$cat.'%')
->where('inventory.active', '=', 1)
->where('inventory.stock_quantity', '>', 2)
->groupby('inventory.id')
->paginate(16);