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();
关键说明
use($status):让闭包能够访问外部的$status变量,解决变量未定义的问题。whereHas:用于筛选存在符合条件关联记录的Job,确保只返回有当前用户对应状态申请的Job。with:加载符合条件的关联JobApplication数据,避免N+1查询的同时,确保返回的Job关联数据只包含匹配条件的记录。auth()->id():替代Auth()->user()->id的简洁写法,效果完全一致。
内容的提问来源于stack exchange,提问作者Vishnu kk
相关产品推荐
相关产品推荐

