如何获取匹配特定行业ID的多态关联求职者数据?
解决方案
要实现仅获取匹配特定行业ID的求职者,你需要使用whereHas方法过滤主模型(Jobseeker),而不是仅在with的闭包里筛选预加载数据。with的闭包只会控制预加载返回的关联数据,但不会过滤主模型本身,这就是你之前得到所有求职者的原因。
步骤1:确认模型关联定义
确保你的模型关联设置正确:
- Jobseeker模型:
public function preference() { return $this->hasOne(Preference::class); }
- Preference模型:
public function industries() { return $this->morphToMany(Industry::class, 'industryable'); }
步骤2:使用whereHas筛选求职者
通过嵌套的whereHas,检查求职者关联的偏好是否关联了目标行业ID:
$jobseekers = Jobseeker::whereHas('preference.industries', function ($query) { $query->where('industry_id', 7); }) // 可选:如果需要仅返回该行业的关联数据,添加带闭包的with ->with(['preference.industries' => function ($query) { $query->where('industry_id', 7); }]) ->get();
whereHas('preference.industries'):确保只返回那些偏好关联了ID为7的行业的求职者。- 带闭包的
with:可选操作,用于控制预加载的industries数据仅包含目标行业,避免返回无关的行业信息。
备选:直接关联中间表查询
如果你更倾向于使用SQL join的方式,也可以直接关联中间表industryables来筛选:
$jobseekers = Jobseeker::join('preferences', 'preferences.jobseeker_id', '=', 'jobseekers.id') ->join('industryables', function ($join) { $join->on('industryables.industryable_id', '=', 'preferences.id') ->where('industryables.industryable_type', '=', 'App\Models\Preference'); }) ->where('industryables.industry_id', 7) ->select('jobseekers.*') ->distinct() // 避免因多行业关联导致的求职者重复 ->with('preference.industries') ->get();
内容的提问来源于stack exchange,提问作者Coder365
相关产品推荐
相关产品推荐

