Laravel Eloquent如何查询多对多关系中未关联proyect的同公司用户
Laravel Eloquent 实现未分配项目同公司用户查询
前置准备
确保你已经在对应模型中定义好了多对多关联:
- User 模型(app/Models/User.php)中添加项目关联:
public function proyects() { return $this->belongsToMany(Proyect::class); }
- Proyect 模型(app/Models/Proyect.php)中添加用户关联:
public function users() { return $this->belongsToMany(User::class); }
实现方式1:推荐写法(基于关联查询,更符合Eloquent规范)
直接使用whereDoesntHave方法筛选不存在指定项目关联的用户,代码逻辑更简洁,可读性更高:
$availableUsers = User::where('company_id', $company_id) ->whereDoesntHave('proyects', function ($query) use ($proyect_id) { $query->where('proyects.id', $proyect_id); }) ->get();
该写法最终生成的SQL执行效果和你提供的原生SQL完全一致,无需手动处理中间表关联逻辑,后续关联规则调整时只要修改模型关联定义即可,维护成本更低。
实现方式2:左连接写法(和原生SQL逻辑完全对齐)
如果你需要完全匹配你现有原生SQL的写法,也可以通过查询构造器手动实现左连接逻辑:
$availableUsers = User::from('users as u') ->leftJoin('proyect_user as pu', function ($join) use ($proyect_id) { $join->on('u.id', '=', 'pu.user_id') ->where('pu.proyect_id', '=', $proyect_id); }) ->where('u.company_id', $company_id) ->whereNull('pu.proyect_id') ->get();
注意事项
你提供的原生SQL中存在变量笔误$company_i,实际使用时请修正为$company_id避免查询报错。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

