Laravel关联表查询:如何筛选发货日期加国内配送时间为今日的订单
解决方案
你需要通过JOIN关联三张表来实现跨表字段的计算过滤,以下是可直接使用的代码(适配MySQL数据库):
use Carbon\Carbon; // 取今日日期字符串,格式和send_date字段保持一致 $today = Carbon::today()->toDateString(); $orders = Order::where('orders.warehouse_id', $warehouseId) // 关联仓库表 ->join('warehouses', 'orders.warehouse_id', '=', 'warehouses.id') // 关联配送配置表 ->join('warehouse_deliveries', 'warehouses.id', '=', 'warehouse_deliveries.warehouse_id') // 计算发货日期加国内配送时间等于今日的条件 ->whereRaw("DATE(DATE_ADD(orders.send_date, INTERVAL warehouse_deliveries.domestic_delivery_time DAY)) = ?", [$today]) // 保留原有预加载 ->with(['product', 'warehouse.warehouseDelivery']) // 只查订单表字段,避免JOIN的其他表同名字段覆盖订单数据 ->select('orders.*') ->get();
补充说明
- 如果仓库可能没有对应的配送配置记录,把
join替换为leftJoin,同时追加->whereNotNull('warehouse_deliveries.id')过滤无配送配置的记录 - 如果使用PostgreSQL数据库,将
whereRaw的语句替换为:->whereRaw("DATE(orders.send_date + (warehouse_deliveries.domestic_delivery_time || ' day')::interval) = ?", [$today]) - 外层加
DATE()包裹是为了兼容send_date为datetime类型的场景,避免时分秒部分影响日期匹配
内容的提问来源于stack exchange,提问作者Klick
相关产品推荐
相关产品推荐

