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

如何获取匹配特定行业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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:01:26