Laravel:将 2 个查询合并为 1 个

Posted

技术标签:

【中文标题】Laravel:将 2 个查询合并为 1 个【英文标题】:Laravel: combine 2 queries into 1 【发布时间】:2020-12-06 02:01:01 【问题描述】:

我有以下关系:

'订单' -> manyToMany -> '产品'

'orders' -> manyToMany -> 'collis' -> manyToMany 产品

不要介意图片中的其他表格。

我想检索所有订购的产品并获取每个产品的总数量。结果应该类似于:

[id: 6, name: "steak", category_name: "beef", total_product_quantity: "2.00"
id: 7, name: "bacon", category_name: "pork", total_product_quantity: "1.00"
id: 9, name: "chicken filet", category_name: "chicken", total_product_quantity: "1.00"

我得到了所有产品而没有考虑到 Colli's

$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_product_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');

两个查询都返回与上述相同的表结构(数组)。但现在我想将第一个表中的 total_product_quantity 添加到第二个表中,并返回合并后的表。我该怎么做?

我对 sql 甚至 laravel 查询构建器的了解都比较少,所以如果有更好的方法来编写查询(也许更有说服力?),请告诉我!

【问题讨论】:

【参考方案1】:

您可以使用关系来获取数据, 这种关系是 hasManyThrough

试试这个:

按模型顺序

public function products()
        return $this->hasManyThrough(Colli::class, Product::class)->withPivot('quantity');

    

【讨论】:

以上是关于Laravel:将 2 个查询合并为 1 个的主要内容,如果未能解决你的问题,请参考以下文章

如何将 2 个查询合并为 1 个?

Postgres如何将2个单独的选择查询合并为1个

Entity Framework Core:如何将 2 个 COUNT 查询合并为一个

将 2 个内部连接结果合并为一个结果

SQL - 如何避免将三个查询合并为一个

如何将这 25 个 INSERT 查询合并为一个?