我有5张桌子:
显然,category_subcontractor 和 order_subcontractor 是数据透视表,一个类别有多个订单。
所以我想使用 orderID 和 CategoryID 从不属于特定订单的类别中检索分包商。
我使用了以下查询,但返回了空数据。
$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']);
最后,我弄清楚了如何获取准确的数据。它可能效率低下,因为我在三个查询中获取所需的数据,但是它有效。
这是我所做的:
首先,我通过连接以下 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();
其次,我通过执行下表获取了添加到订单中的所有分包商:
分包商
订单_分包商
订单
$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']);