You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:更优实现(推荐,性能更高)

直接从订单维度查询,避免循环和去重操作,性能提升明显,需要先补充两个关联定义:

  1. 在Order模型中添加和订单明细的关联:
// Order模型新增
public function orderItems() {
    return $this->hasMany(OrderItem::class, 'order_id');
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:54:03