Laravel Eloquent:获取用户未分配的部门数据
解决方案
一、先修正关联(可选但更规范)
你当前在AllocatedDepartment模型中定义的departments关联有误——一条分配记录仅对应一个部门,应该使用belongsTo而非hasMany:
// AllocatedDepartment.php public function department() { return $this->belongsTo(Department::class, 'department_id'); }
同时在User模型中建立与分配记录的关联:
// User.php public function allocatedDepartments() { return $this->hasMany(AllocatedDepartment::class); }
此时获取已分配部门可以直接通过:
$user->allocatedDepartments->pluck('department');
二、获取未分配部门的两种方法
方法1:基于已分配ID快速过滤
在User模型中添加方法,先获取当前用户已分配的部门ID集合,再用whereNotIn排除这些ID得到未分配部门:
// User.php public function getUnallocatedDepartments() { $allocatedDeptIds = $this->allocatedDepartments()->pluck('department_id'); return Department::whereNotIn('id', $allocatedDeptIds)->get(); }
调用方式:$user->getUnallocatedDepartments();
方法2:多对多关联(更优雅的Eloquent实现)
将User与Department定义为多对多关联,操作逻辑更简洁:
- 在
User模型中定义多对多关联:
// User.php public function departments() { return $this->belongsToMany( Department::class, 'allocated_departments', // 中间表名 'user_id', // 用户侧外键 'department_id' // 部门侧外键 ); }
- 在
Department模型中添加反向关联:
// Department.php public function users() { return $this->belongsToMany( User::class, 'allocated_departments', 'department_id', 'user_id' ); }
此时获取已分配部门直接用:$user->departments;
获取未分配部门则通过whereDoesntHave查询不存在关联的部门:
// User.php public function unallocatedDepartments() { return Department::whereDoesntHave('users', function ($query) { $query->where('user_id', $this->id); })->get(); }
调用方式:$user->unallocatedDepartments();
内容的提问来源于stack exchange,提问作者Usman Khan
相关产品推荐
相关产品推荐

