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

Laravel Blade中使用foreach获取关联对象返回空数组问题排查

问题解决:预订关联的订单详情返回空数组

问题说明

尝试获取某条预订(Booking)关联的订单(Order)下的所有订单详情(OrderDetail),数据库中存在对应记录,但视图里$booking->order->orderOrderDetails返回空数组。

相关代码及数据

Booking模型

protected $fillable = [
    'room_id',
    'invoice_id',
    'order_id',
    'status',
    'start_time',
    'end_time',
];

public function invoice()
{
    return $this->belongsTo(Invoice::class, 'invoice_id');
}

public function order()
{
    return $this->belongsTo(Order::class, 'order_id');
}

Order模型

protected $fillable = [
    'booking_id',
    'serial_number',
    'subtotal',
];

public function orderOrderDetails()
{
    return $this->hasMany(OrderDetail::class, 'order_id', 'id');
}

public function booking()
{
    return $this->belongsTo(Booking::class, 'booking_id');
}

OrderDetail模型

protected $fillable = [
    'order_id',
    'order_item_id',
    'quantity',
    'amount',
];

public function order()
{
    return $this->belongsTo(Order::class, 'order_id');
}

public function order_item()
{
    return $this->belongsTo(Product::class, 'order_item_id');
}

Home控制器

class HomeController
{
    public function index()
    {
        $bookings = Booking::where('status', "in_progress")->orWhere('status', "unpaid")->get();   // dd($bookings)显示5个对象
        return view('home', compact('bookings'));
    }
}

Home视图

@if ($bookings !== NULL)
    @foreach ($bookings as  $booking)
        @foreach ($booking->order->orderOrderDetails as  $orderDetail)   // $booking->order->orderOrderDetails返回空数组,尽管数据库有记录
            <p>{{ $orderDetail->item->name ?? ''}}</p>
            <p>{{ $orderDetail->item->price ?? ''}}</p>
            <p>{{ $orderDetail->item->quantity ?? ''}}</p>
        @endforeach
    @endforeach
@endif

数据库关联验证

需确认:

  • 预订表(bookings)的order_id与订单表(orders)的id一一对应
  • 订单表(orders)的id与订单详情表(order_details)的order_id一一对应
  • 目标预订记录对应的订单确实存在关联的订单详情记录

解决方案

1. 预加载嵌套关联,避免懒加载问题

控制器中使用with()方法预加载嵌套关联,确保关联数据被一次性加载,同时简化查询逻辑:

class HomeController
{
    public function index()
    {
        $bookings = Booking::with('order.orderOrderDetails')
            ->whereIn('status', ['in_progress', 'unpaid'])
            ->get();
        return view('home', compact('bookings'));
    }
}

2. 修正视图中的关联调用错误

OrderDetail模型中关联商品的方法是order_item(),视图中需对应改为$orderDetail->order_item,且quantity是订单详情自身的字段,不是商品的,同时增加空值判断避免报错:

@if ($bookings)
    @foreach ($bookings as $booking)
        @if ($booking->order)
            @foreach ($booking->order->orderOrderDetails as $orderDetail)
                <p>{{ $orderDetail->order_item->name ?? ''}}</p>
                <p>{{ $orderDetail->order_item->price ?? ''}}</p>
                <p>{{ $orderDetail->quantity ?? ''}}</p>
            @endforeach
        @endif
    @endforeach
@endif

3. 验证模型表名(可选)

如果数据库表名不符合Laravel默认复数规则,需在模型中指定$table属性,例如:

// 在OrderDetail模型中添加
protected $table = 'order_details';

4. 确认关联字段匹配

检查Order模型中orderOrderDetails()方法的关联字段是否与数据库一致:

public function orderOrderDetails()
{
    // 格式:hasMany(关联模型, 外键字段, 本地键字段)
    return $this->hasMany(OrderDetail::class, 'order_id', 'id');
}

若数据库字段名不同,需对应调整参数。

内容的提问来源于stack exchange,提问作者Hagar Maher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:40:32