php - 如何合并和求和具有相同 ID 值的项目的某些值

标签 php mysql laravel eloquent

所以我有两张 table 。 订单OrderItems。关系是每个Order可以有很多OrderItems(orderitem只是一个产品)。

订单项目表

id INT PRIMARY KEY
name TEXT
quantity INT
pack_value INT
order_id INT FOREIGN KEY REFERENCES ORDER_ID ON ORDERS TABLE
product_id INT FOREIGN KEY REFERENCES PRODUCT_ID ON PRODUCTS TABLE

订单表

order_id INT PRIMARY KEY
status TEXT
user_id INT FOREIGN KEY REFERENCES USER_ID ON USERS TABLE

一个订单可以有相同的 OrderItem 两次或仅一次。例如,如下所示,3 个项目但 2 个产品:

OrderItem(id=1, product_id=100, name="Pizza", quantity=2, pack_value=10, order_id=7)
OrderItem(id=2, product_id=100, name="Pizza", quantity=10, pack_value=1, order_id=7)
OrderItem(id=3, product_id=555, name="Olives", quantity=5, pack_value=1, order_id=7)

所以上面有 2 个 Pizza 条目,这是我得到的结果。但是我希望它只显示 Pizza 的 1 个条目,因为它是同一项目。以下是我想看到的内容:

OrderItem(product_id=100, name="Pizza", quantity=30, pack_value=1, order_id=7)
OrderItem(product_id=555, name="Olives", quantity=5, pack_value=1, order_id=7)

所以本质上,如果该项目仅存在一次,则不对其执行任何操作。如果存在两次,则使 pack_value=1 且数量为各个 quantity*pack_value 的总和。因此,在上面的示例中,数量变为 (2*10 + 10*1 = 30)

Controller 方法如下所示,所以这就是我想要执行此操作的地方:

public function showOrderDetails(Order $order){
    return view('orders.show', compact('order'));
}

此外,OrderOrderItem 模型也具有用于关系的方法。例如,在订单模型中我有:

public function orderItems(){
    return $this->hasMany(OrderItem::class, 'order_id');
}

谢谢,如果您需要任何额外信息,我可以提供。

最佳答案

SELECT name, 
       SUM(quantity * pack_value) AS quantity,
       1 AS pack_value,
       order_id
FROM order_items
GROUP BY name,
         order_id;

fiddle

使用它作为子查询将其他表合并到此代码中,或者根据需要将它们添加到 FROM 子句中(调整其输出列表和分组表达式)。

关于php - 如何合并和求和具有相同 ID 值的项目的某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64168335/

相关文章:

Mysql 糟糕的性能

Laravel 8 项目未在服务器中打开..在 TestDatabases.php 中出现错误

php - 我如何使用 php 代码调用纸张扫描仪?

mysql - Typeorm 插入数据,即使它存在

javascript - 如何使用highchart动态将柱形图更改为镜像图

SQL - 按范围计数

php - 在 Laravel 5.1 中使用 .env 设置存储路径

php - Route.php 中的 ReflectionException 第 335 行 : Function () does not exist

php - 帖子更新无需重新加载页面

php - UPS 运输模块无法在 Linux 环境中运行