Laravel中从Booking模型查询Order?belongsTo关联失效问题
问题解决方法
你的问题出在关联类型使用错误:Order和Booking通过中间表order_bookings建立的是多对多关系,但Booking模型里误用了belongsTo(这是一对多关系的反向关联),导致查询失效。
修正方案
把Booking模型中的order()方法改成belongsToMany关联,参数和Order模型的关联对应:
class Booking extends Model { protected $guarded = []; public function orders(){ // 多对多反向关联,参数依次是:关联模型、中间表名、当前模型在中间表的外键、关联模型在中间表的外键 return $this->belongsToMany(Order::class,'order_bookings','booking_id','order_id'); } }
为什么原来的代码不生效?
belongsTo用于一对多关系:比如一个Booking只属于一个Order,这种场景不需要中间表,直接在bookings表添加order_id字段即可,此时Booking模型的关联写法是return $this->belongsTo(Order::class, 'order_id');。- 你用了中间表
order_bookings,说明是多对多关系(一个Order对应多个Booking,一个Booking也可以对应多个Order),这种情况下两边的模型都需要用belongsToMany来定义关联。
额外说明
如果你的实际业务是一个Booking只能属于一个Order(一对多),那更合理的做法是:
- 删除
order_bookings中间表; - 在
bookings表中添加order_id字段(外键关联orders.id); - 修改两个模型的关联:
- Order模型:
public function bookings(){ return $this->hasMany(Booking::class); } - Booking模型:
public function order(){ return $this->belongsTo(Order::class); }
- Order模型:
内容的提问来源于stack exchange,提问作者B L Praveen
相关产品推荐
相关产品推荐

