Laravel中如何查询指定餐厅当日或指定日期的全部订单?
实现方案
前提说明
首先确保 orders 表存在 created_at 时间戳字段,这是按日期过滤订单的基础。另外你提供的 orders 表字段中 amount 拼写为 amonut,建议修正避免后续业务报错。
方法1:基于现有代码调整(最小改动)
你现有的写法会存在两个问题:一是同一订单包含多个该餐厅商品时会被重复统计,二是存在N+1查询性能问题。最小改动的修改方式如下:
查询当日订单
use Carbon\Carbon; $restaurant = Restaurant::with(['restaurant_items' => function ($query) { // 预加载时就过滤当日订单,减少查询开销 $query->with(['orders' => function ($orderQuery) { $orderQuery->whereDate('created_at', Carbon::today()); }]); }])->find($id); // 用集合合并+去重避免订单重复 $orders = collect(); foreach ($restaurant->restaurant_items as $item) { $orders = $orders->merge($item->orders); } $orders = $orders->unique('id');
查询指定日期订单
只需要把上述代码中的Carbon::today()替换为你要查询的目标日期即可:
use Carbon\Carbon; // 替换为你要查询的日期,支持'2024-05-20'、'2024/05/20'等格式 $targetDate = Carbon::parse('2024-05-20'); $restaurant = Restaurant::with(['restaurant_items' => function ($query) use ($targetDate) { $query->with(['orders' => function ($orderQuery) use ($targetDate) { $orderQuery->whereDate('created_at', $targetDate); }]); }])->find($id); // 合并去重逻辑和当日查询一致 $orders = collect(); foreach ($restaurant->restaurant_items as $item) { $orders = $orders->merge($item->orders); } $orders = $orders->unique('id');
方法2:更优实现(推荐,性能更高)
直接从订单维度查询,避免循环和去重操作,性能提升明显,需要先补充两个关联定义:
- 在
Order模型中添加和订单明细的关联:
// Order模型新增 public function orderItems() { return $this->hasMany(OrderItem::class, 'order_id'); }
- 在
OrderItem模型中添加和商品的关联:
// OrderItem模型新增 public function item() { return $this->belongsTo(Item::class, 'item_id'); }
查询当日订单
use Carbon\Carbon; $restaurantId = $id; $orders = Order::whereDate('created_at', Carbon::today()) ->whereHas('orderItems.item.category', function ($query) use ($restaurantId) { $query->where('restaurant_id', $restaurantId); }) ->get();
查询指定日期订单
use Carbon\Carbon; $restaurantId = $id; // 替换为目标日期即可 $targetDate = Carbon::parse('2024-05-20'); $orders = Order::whereDate('created_at', $targetDate) ->whereHas('orderItems.item.category', function ($query) use ($restaurantId) { $query->where('restaurant_id', $restaurantId); }) ->get();
内容的提问来源于stack exchange,提问作者ihprince
相关产品推荐
相关产品推荐

