Laravel Eloquent关联查询条件未生效返回全部用户数据如何修复?
问题原因
with()是关联预加载方法,仅会限制返回的关联数据的查询条件,不会对主模型User的查询结果做过滤,所以不符合关联条件的用户也会被返回,仅关联字段orders为null,这是你拿到所有User行的核心原因。- 关联定义错误:
User作为主表,一个用户对应多条订单,应该使用hasMany定义关联,你现在用的belongsTo是从属关联,仅适用于订单表关联所属用户的场景。
修复步骤
第一步:修正关联定义
修改 User 模型的 orders 方法:
public function orders() { return $this->hasMany(Orders::class, 'order_userId', 'id'); }
第二步:使用whereHas过滤主模型
如果仅需要获取符合条件的用户 id 和 name,不需要返回关联的订单数据,直接使用以下代码:
$data = User::whereHas('orders', function ($query) { $query->where('order', false) ->whereNull('uploadId'); })->pluck('name', 'id');
如果需要同时返回符合条件的订单数据,可以搭配 with 一起使用:
$data = User::whereHas('orders', function ($query) { $query->where('order', false) ->whereNull('uploadId'); })->with(['orders' => function ($query) { $query->where('order', false) ->whereNull('uploadId'); }])->get(['id', 'name']);
优化写法(Laravel 9+ 支持)
可以用 withWhereHas 简化重复的闭包逻辑:
$data = User::withWhereHas('orders', function ($query) { $query->where('order', false) ->whereNull('uploadId'); })->get(['id', 'name']);
内容的提问来源于stack exchange,提问作者user17189691
相关产品推荐
相关产品推荐

