Laravel BelongsTo关联使用模型实例属性做where条件预加载失效问题咨询
问题原因
你遇到的预加载失效、懒加载正常的现象,本质是两种加载方式的执行时机不同导致的:
- 懒加载(
Order::first()->user):会先查询到单个Order的完整数据,封装成实例后再调用关联方法构建查询,此时$this指向已加载的Order实例,$this->customer_id有明确值,条件可以正常生效。 - 预加载(
Order::with('user')->get()):会先执行Order的主查询,在把查询结果封装为Order实例之前,就会调用关联方法生成关联查询,此时$this只是一个空的Order模型模板,没有实际的customer_id属性值,所以where条件失效,自然查不到对应数据。
核心问题解答
预加载时无法直接使用模型实例属性作为where条件,因为关联查询的构建时机早于模型实例的初始化,此时还没有实例属性可以读取。
如果要定义基于两个字段匹配的BelongsTo关联,可以使用whereColumn方法在SQL层面直接关联两个表的对应字段,不需要依赖单个实例的属性,修改后的关联代码如下:
class Order extends Model { public function user(): BelongsTo { return $this->belongsTo(User::class, 'shipping_email_address', 'email_address') ->whereColumn('users.customer_id', 'orders.customer_id'); } }
该写法对预加载和懒加载都生效,运行时会自动在关联查询中加入两个表customer_id相等的约束,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jan-Paul Kleemans
相关产品推荐
相关产品推荐

