Laravel中如何关联3张表查询订单数据,解决获取商品属性报错问题
问题解决步骤
错误原因
你遇到的
Trying to get property 'name' of non object错误是因为:
- 没有在
Order模型中定义和Product表的关联关系,直接用外键字段id_product(仅存储商品ID数值,不是关联对象)调用属性- 查询订单时没有预加载关联的商品数据
- 视图中字段写错:Order表字段是
date而非data
第一步:在Order模型中定义关联关系
在app/Models/Order.php中添加和Product表的关联方法:
// Order模型内新增方法 public function product() { // 第二个参数指定自定义外键名id_product,Laravel默认会找product_id,必须手动指定 return $this->belongsTo(Product::class, 'id_product'); }
第二步:修改控制器查询代码,预加载关联数据
修改OrderController中的查询逻辑,用with()预加载商品关联,避免N+1查询问题:
// 注意Order模型首字母大写,with参数对应上一步定义的关联方法名product $orderdetail = Order::where('id_user', auth()->id())->with('product')->get();
第三步:修改Blade模板代码
调整字段调用方式,同时添加容错逻辑避免商品被删除时再次报错:
<?php $no=1 ?> @foreach ($orderdetail as $order) {{$no++}} {{$order->id}} {{-- 修正字段错误:原字段是date不是data --}} {{$order->date}} {{-- 调用关联对象product的name属性,optional是容错方法,PHP8以上也可以写$order->product?->name --}} {{optional($order->product)->name}} {{$order->price}} {{$order->total_order}} {{$order->total_price}} @endforeach
内容的提问来源于stack exchange,提问作者Eren_Jaeger_Snk
相关产品推荐
相关产品推荐

