评价数的计算逻辑有问题?

$result = OrderItem::query()
    ->where('product_id', $item->product_id)
    ->whereHas('order', function ($query) {
        $query->whereNotNull('paid_at');
    })
    ->first([
        DB::raw('count(*) as review_count'),
        DB::raw('avg(rating) as rating')
    ]);

假如同一个商品有两个订单,均已支付还未评价,现在,当我评价 id 较大的订单的时候,此处的 review_count 是 2,而且商品的评价数也变成了 2,但是实际上还有一个 id 小的订单未评价,评价数应该是 1 ?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 3

个人觉得应该根据 Orderreviewed 计算,$query->whereNotNull('paid_at') 换为 $query->where('reviewed', 1)

5年前 评论
JasonG

个人愚见,跟id大小其实没有关系,whereHas 只是查询出了这款商品的已支付订单,并不能保证其他支付的订单也评论了

whereHas('order', function($query) {
    $query->whereNotNull('paid_at');
}

我觉得修改成这样比较合理

$reviews = OrderItem::query()->with(['order.user', 'productSku'])
        ->where('product_id', $product->id)
        ->whereNotNull('reviewed_at')
        ->orderBy('reviewed_at', 'desc')
        ->limit(10)
        ->get();
4年前 评论
circle

我觉得应该这样

    public function handle(OrderReviewed $event)
    {
        $items = $event->getOrder()->items()->with(['product'])->get();
        foreach ($items as $item) {
            $result = OrderItem::query()
                ->where('product_id', $item->product_id)
                ->whereNotNull('reviewed_at')  <-- 加了这句
                ->whereHas('order', function ($query) {
                    $query->whereNotNull('paid_at');
                })
                ->first([
                    DB::raw('count(*) as review_count'),
                    DB::raw('avg(rating) as rating'),
                ]);
            // 更新商品评分和评价
            $item->product->update([
                'rating'       => $result->rating,
                'review_count' => $result->review_count,
            ]);
        }
    }
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!