Laravel 使用WhereNotIn 连接 5 个表

问题描述 投票:0回答:1

我有5张桌子:

  1. 订单
  2. 订单_分包商
  3. 分包商
  4. 类别
  5. 类别_分包商

显然,category_subcontractor 和 order_subcontractor 是数据透视表,一个类别有多个订单。

所以我想使用 orderID 和 CategoryID 从不属于特定订单的类别中检索分包商。

enter image description here

我使用了以下查询,但返回了空数据。

$subcontractors = Subcontractor::join('category_subcontractor', 'subcontractors.id', '=', 'category_subcontractor.subcontractor_id')
        ->join('Categories', 'category_subcontractor.category_id', '=', 'categories.id')
        ->join('orders', 'categories.id', '=', 'orders.category_id')
        ->where('categories.id', '=', $catID)
        ->where('orders.id', '=', $orderID)
         ->whereNotIn('category_id',function($query){
            $query->select('orders.category_id')->from('orders');
         }) 
        ->orderBy('subcontractors.created_at', 'desc')
        ->get(['subcontractors.id as value', 'subcontractor_name as name']);  

ER-Diagram

php laravel join nested subquery
1个回答
0
投票

最后,我弄清楚了如何获取准确的数据。它可能效率低下,因为我在三个查询中获取所需的数据,但是它有效。

这是我所做的:

首先,我通过连接以下 3 个表来获取属于某个类别的所有分包商:

  1. 类别

  2. 类别_分包商

  3. 分包商

    $q1 = 分包商::join('category_subcontractor', 'subcontractors.id', '=', 'category_subcontractor.subcontractor_id')
            ->join('类别', 'category_subcontractor.category_id', '=', 'categories.id')
            ->where('categories.id', '=', $catID)
            ->pluck('subcontractors.id 作为值')
            ->toArray();

其次,我通过执行下表获取了添加到订单中的所有分包商:

  1. 分包商

  2. 订单_分包商

  3. 订单

    $q2 = 分包商::join('subcontractor_orders', 'subcontractors.id', '=', 'subcontractor_orders.subcontractor_id')
            ->join('orders', 'subcontractor_orders.order_id', '=', 'orders.id')
            ->where('orders.id', '=', $orderID)
            ->where('orders.category_id', '=', $catID)
            ->pluck('subcontractors.id 作为值')
            ->toArray();

最后,我得到了$q1和$q2之间的差异,并使用上次查询结果再次从分包商表中查询,如下:

$differenceArray = array_diff($q1, $q2);

 $subcontractors = 分包商::whereIn('id', $differenceArray)
            ->get(['subcontractors.id as value', 'subcontractors.subcontractor_name as name']);
© www.soinside.com 2019 - 2024. All rights reserved.