模型工厂查出商品的销量、评分、评价数疑问?
// 根据商品 ID 过滤掉重复的商品
$products->unique('id')->each(function (Product $product) {
// 查出该商品的销量、评分、评价数
$result = OrderItem::query()
->where('product_id', $product->id)
->whereHas('order', function ($query) {
$query->whereNotNull('paid_at');
})
->first([
\DB::raw('count(*) as review_count'),
\DB::raw('avg(rating) as rating'),
\DB::raw('sum(amount) as sold_count'),
]);
.
.
.
});
在这里面,如果一个订单付完款,但是没有进行评价
// 这里是不是把没评价的也算在评价总数里了?
\DB::raw('count(*) as review_count'),
// 这里是不是把没评分的也算在评分平均值里了?
\DB::raw('avg(rating) as rating'),
// 销售量是不是也要判断该笔订单没有发起退款?
\DB::raw('sum(amount) as sold_count'),
??? 没有人回答了。
AVG()
函数是忽略值为NULL
的行的,所以不会把没评分的也算在评分平均值里。COUNT()
函数指定具体列时,会忽略该列值为NULL
的行;如果函数里面是*
的话,则不会忽略NULL
。COUNT()
函数试验过程如下:order_items 表
代码为
\DB::raw('count(*) as review_count')
时,执行情况如下:代码为
\DB::raw('count(review) as review_count')
时,执行情况如下:小结:用第二种方法可以查询到付款后已评价的订单数量
我也觉得算review_count这个地方有问题, 应该用 count(‘review’) as review_count