首页 > 解决方案 > Laravel sum 数量和按 product_id 分组并返回表数据

问题描述

表数据:

id || product_id || quantity || sold_price || image (Relationship)
1  ||      1     ||    10    ||     10     || 1.png
2  ||      2     ||    5     ||     20     || 2.png
3  ||      1     ||    15    ||     15     || 1.png

预期回报数据

重复product_id25和平均售价的sold_price总和10+15/2 = 2

为了获得平均水平,我们得到sum/counter你已经知道的。

预期结果

id || product_id || quantity || sold_price || image (Relationship)
1  ||      1     ||    25    ||     12.5   || 1.png
2  ||      2     ||    5     ||     20     || 2.png

我试过的

$products = SoldProducts::whereIn('export_invoice_id', $export_invoice_ids)
            ->groupBy(DB::raw('product_id'))
            ->select([
                'sold_price',
                DB::raw('sum(quantity) total_quantity'),
            ])
            -> get();

但是这个回报只有total_quantityproduct_id没有id, average_sold_price, image

问题

问题是image来自关系。

我尝试使用with('image'),但选择不起作用。

标签: laravel

解决方案


如果我正确理解了这个问题,那么以下代码应该可以纠正您的问题。

$products = SoldProducts::whereIn('export_invoice_id', $export_invoice_ids)
    ->groupBy('product_id')
    ->join('images', 'product.image_id', '=', 'images.id')
    ->select([
        'products.id',
        'products.product_id',
        DB::raw('sum(products.quantity) AS quantity'),
        DB::raw('(sum(products.sold_price) / count(*)) AS sold_price'),
        'images.image'
    ])
    ->get();

如果您使用 select,则需要在 select 中选择您需要的每一列以便 Eloquent 检索它,否则它不会为您提取该列。

您需要两个 DB::raw 在您的选择中 - 根据您的规格,一个用于数量,一个用于售价;数量是一个简单的总和。它总结了每个产品 ID 的所有项目。售出的价格先相加,然后除以该 product_id 的数量。

编辑:我已经更新了代码示例 - 但由于您没有指定图像如何连接到表格中,所以我进行了有根据的猜测。如果您并不总是分配图像,则可能需要将其设置为 ->leftJoin。


推荐阅读