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

$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 ?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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年前 评论

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