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

Laravel hasMany关联下带条件的关联数据查询问题

问题与解决方案

现有代码片段

Job 模型

public function jobApplications() 
{
    return $this->hasMany(JobApplication::class, 'job_id');
}

JobApplication 模型

public function jobs() 
{
    return $this->belongsTo(Job::class, 'job_id');
}

job_applications 迁移文件

$table->id();
$table->foreignId("job_id")->constrained("jobs");
$table->foreignId("user_id")->constrained("users");
$table->text('remarks')->nullable();
$table->unsignedInteger('status')->default(1);

需求

获取所有status=1的Job,同时加载其对应的JobApplication,要求关联的JobApplication满足:

  • status等于用户输入的状态
  • user_id为当前认证用户ID

问题代码及错误

尝试的代码:

$jobs = Job::where('status',1);
$status =$request->status;

if($status){
    $jobs = $jobs->whereHas('jobApplications', function($q){
        $q->where('status',$status);
        $q->where('user_id',Auth()->user()->id);
    });
    return $jobs->get();
}

报错:undefined variable status

解决方案

错误原因是闭包函数无法直接访问外部作用域的$status变量,需要通过use($status)将变量传入闭包。同时如果需要加载符合条件的关联数据,要配合with方法做关联筛选:

$status = $request->status;
$jobsQuery = Job::where('status', 1);

if ($status) {
    $jobsQuery->whereHas('jobApplications', function ($query) use ($status) {
        $query->where('status', $status)
              ->where('user_id', auth()->id());
    })
    // 加载当前用户且状态匹配的JobApplication关联数据
    ->with(['jobApplications' => function ($query) use ($status) {
        $query->where('status', $status)
              ->where('user_id', auth()->id());
    }]);
}

return $jobsQuery->get();

关键说明

  1. use($status):让闭包能够访问外部的$status变量,解决变量未定义的问题。
  2. whereHas:用于筛选存在符合条件关联记录的Job,确保只返回有当前用户对应状态申请的Job。
  3. with:加载符合条件的关联JobApplication数据,避免N+1查询的同时,确保返回的Job关联数据只包含匹配条件的记录。
  4. auth()->id():替代Auth()->user()->id的简洁写法,效果完全一致。

内容的提问来源于stack exchange,提问作者Vishnu kk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:07:06