Laravel Eloquent:获取嵌套关系中的数据总和并将其添加为新属性
Posted
技术标签:
【中文标题】Laravel Eloquent:获取嵌套关系中的数据总和并将其添加为新属性【英文标题】:Laravel Eloquent: Getting sum of data in nested relations and adding it as a new attribute 【发布时间】:2020-12-05 11:41:40 【问题描述】:我想为一个复杂的问题(甚至更复杂的问题)找到一个查询。希望有人可以帮助我。
我有一个包含许多产品的订单表(多对多关系)。您可以订购产品并选择数量,该数量保存在数据透视表中。
我知道我可以使用他们的产品获得所有订单
$query = Order::with(['products'=>function($q)
$q->select('name', 'price', 'quantity', 'unit')->orderBy('name','asc');
]);
现在我要检索的是一个对象数组,其中仅包含每个产品的名称以及所有订单的数量总和。 在这种情况下,产品代表肉类的类型。所以结果应该是这样的:
[
name: steak,
unit: piece,
totalQuantity: 20
,
name: bacon,
unit: kg,
totalQuantity: 112
]
如果有人能为此提出解决方案,那就太好了!
有点复杂:
每个订单也可以有许多colli's(包装),其中包含许多具有一定数量/数量的产品。 所以订单表 -> manyToMany -> collis 表 -> manyToMany -> products 表
我需要和上面一样,但现在需要colli's中所有产品的所有数量的总和以及其他产品的所有数量的总和。
感谢您提供任何帮助,因为我在文档中找不到很多关于急切加载的信息。
【问题讨论】:
【参考方案1】:你可以试试这个。
$query = Order::with('products'=>function($q)
$q->select('name', 'price','unit',DB::raw("SUM(quantity) as total_quantity"))->groupBy('name')->orderBy('name','asc');
);
我希望它对你有用。
【讨论】:
然后我得到“语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 中的列的非聚合列 'products.price'子句;"【参考方案2】:找到第一个问题的答案:
$allProducts = DB::query()
->select(['p.id', 'p.name', 'c.name as category_name', DB::raw('sum(op.quantity) as total_product_quantity')])
->from('products as p')
->join('order_product as op', 'p.id', '=', 'op.product_id')
->join('orders as o', 'op.order_id', '=', 'o.id')
->join('categories as c', 'p.category_id', '=', 'c.id')
->groupBy('p.id');
对于第二个问题,我得到与上面完全相同的表格。现在所有colli's中的所有产品:
$allProductsInAllCollis = DB::query()
->select(['p.id', 'p.name', 'c.name as category_name', DB::raw('sum(co.quantity * colp.quantity) as total_colli_quantity')])
->from('products as p')
->join('colli_product as colp', 'p.id', '=', 'colp.product_id')
->join('collis as col', 'colp.colli_id', '=', 'col.id')
->join('colli_order as co', 'col.id', '=', 'co.colli_id')
->join('orders as o', 'co.order_id', '=', 'o.id')
->join('categories as c', 'col.category_id', '=', 'c.id')
->groupBy('p.id', 'p.name', 'category_name');
(不知道为什么我必须在 groupBy 中传递“p.name”和“category_name”,否则会出现 sql 错误。
现在要做的最后一件事是执行另一个 groupBy 以将第一个表的“total_product_quantity”添加到第二个表的“total_colli_quantity”。如何使用保存在变量中的 2 个查询来做到这一点?
【讨论】:
您应该编辑上述问题或发送另一个问题,因为您得到了答案。否则,这没关系,因为人们不会回答人们的答案,因此请编辑您的主要答案或编写一个新答案。祝你好运。 没错,新问题来了:***.com/questions/63442285/…以上是关于Laravel Eloquent:获取嵌套关系中的数据总和并将其添加为新属性的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent - 使用过滤数据获取嵌套关系
Laravel 混合获取 Eloquent 急切加载嵌套多个模型