You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:42:27