如何使用Laravel Eloquent查询所有子项均匹配指定属性的父记录
Laravel Eloquent 实现「所有关联子项满足指定条件」的查询
前置准备:定义模型关联
首先在父表对应的模型中,配置和子表的一对多关联:
// app/Models/Parent.php 父模型 namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class Parent extends Model { /** * 关联所有子记录 */ public function children(): HasMany { // 传入参数依次为:子模型类名、子表关联外键、父表主键 return $this->hasMany(Child::class, 'parent_id', 'id'); } }
核心查询代码
注意不要直接用whereHas匹配status=3的子项,这个写法只会匹配「至少有一个子项status为3」的父记录,会把id=1这类存在不符合条件子项的父数据误查出来。
正确写法是用反向排除逻辑:如果需要排除没有任何子项的父记录,先加has筛选,再排除掉存在任意子项status不等于3的父记录,剩下的就是全量子项都符合要求的结果:
$validParents = Parent::query() // 过滤掉没有任何子项的父记录,业务上允许无子项的父记录算符合条件可删除这行 ->has('children') // 排除存在不符合status=3子项的父记录 ->whereDoesntHave('children', function ($subQuery) { $subQuery->where('status', '!=', 3); }) ->get();
结果验证
对应给出的测试数据:
- 父记录id=1:关联子项存在status=2的数据,会被排除
- 父记录id=2:关联的2条子项status均为3,会被正确返回,和预期结果一致。
内容的提问来源于stack exchange,提问作者yisic80
相关产品推荐
相关产品推荐

