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 急切加载嵌套多个模型

laravel eloquent - 在嵌套急切加载的关系上不使用

Laravel Eloquent:渴望加载多个嵌套关系

Laravel Eloquent - 如何获得嵌套关系

Laravel Eloquent 嵌套关系枢轴与约束