Laravel JOIN 的 WHERE 范围

Laravel WHERE scope on JOIN

我正在尝试“轮班”并获取我拥有的所有记录, 但我加入了订单和 运行,其中 delivery_date 的订单在这里是“班次”,没有订单被删除 现在我只需要在订单上设置位置而不影响轮班

Shift::leftJoin('mt_plans', 'mt_plans.shift_id', '=', 'shifts.id')
   ->leftJoin('subscriptions', 'subscriptions.plan_id', '=', 'mt_plans.plan_id')
   ->join('orders', 'orders.subscription_id', '=', 'subscriptions.id')
   ->join('mt_order_details', 'mt_order_details.order_id', '=', 'orders.id')
   ->join('mt_item', 'mt_item.item_id', '=', 'mt_order_details.item_id')
   ->where('orders.delivery_date', $request->date)
   ->whereIn('orders.status', [OrderStatus::ACCEPTED, OrderStatus::ASSIGNED, OrderStatus::FAILED, OrderStatus::SUCCESSFUL])
   ->select([
  'mt_item.item_id as meal_id',
                'mt_item.en_name',
                'mt_item.color',
                'mt_item.label_number',
                'shifts.id as shift_id',
                'shifts.title',
                'shifts.start_time',
                'shifts.end_time',
                'shifts.pickup_time'
   ])
   ->get();

您需要在您的条件适用的地方进行左连接:

Shift::leftJoin('mt_plans', 'mt_plans.shift_id', '=', 'shifts.id')
   ->leftJoin('subscriptions', 'subscriptions.plan_id', '=', 'mt_plans.plan_id')
      ->leftJoin('orders', function($q) use($request) {
           $q->on('orders.subscription_id', '=', 'subscriptions.id');
           $q->where('orders.delivery_date', '=', $request->date);
      })
      ->leftJoin('mt_order_details', 'mt_order_details.order_id', '=', 'orders.id')
      ->leftJoin('mt_item', 'mt_item.item_id', '=', 'mt_order_details.item_id')
      ->whereIn('orders.status', [OrderStatus::ACCEPTED, OrderStatus::ASSIGNED, OrderStatus::FAILED, OrderStatus::SUCCESSFUL])
      ->select([
           'mt_item.item_id as meal_id',
            'mt_item.en_name',
            'mt_item.color',
            'mt_item.label_number',
            'shifts.id as shift_id',
            'shifts.title',
            'shifts.start_time',
            'shifts.end_time',
            'shifts.pickup_time'
       ])
      ->get();

然后您保留所有“班次”,但仅加入具有 delivery_date 条件的订单。 请记住,它将检索所有适用 where 条件的“班次”。如果不匹配 id 和 delivery_date

orders 将为 null