在我的 Role.php 中,我有以下内容。
class Role extends Model
{
protected $fillable = [
'name'
];
public function users()
{
return $this->belongsToMany(User::class)->withTimestamps();
}
}
我尝试过这样的查询:
$leaders = Role::where('name','leader')->with('users')->first();
通过查询我得到了两个名字:
1->Tanvir AHmed
2->Nayeem
而且,我还有一个名为teams
的表,它有一个名为leader_name
的列和类似以下的数据:
teams.leader_name
Tanvir AHmed
现在,我想获取团队表中未包含的名称。就像在这种情况下,存在Tanvir而Nayeem不存在。我该如何获取这个名字(Nayeem)?
答案 0 :(得分:1)
您可以分两个步骤完成所有操作:
// First step: retrieve all team_leaders distinct values
$team_leader_names = Teams::groupBy('team_leaders')->get()->pluck('name');
// Second step: search users by name
$users = User::whereHas('roles', function($query){
$query->where('name', '=', 'leader');
})->whereNotIn('name', team_leader_names)->get();
嗯,如果teams
表中有一个leader_id
外键,那会简单得多。并且有很多原因:
leader role
且名称相同的用户,但是team leader
只有一个用户怎么办?上面的查询将排除这两者。leader_name
列,这会使您的代码更复杂。使用外键,您的查询将变为:
$users = User::whereHas('roles', function($query){
$query->where('name', '=', 'leader');
})->whereDoesntHave('leadership')->get();
,例如,leadership
被定义为您的User
模型中的关系,如下所示:
public class User {
// [...]
public function leadership() {
return $this->hasMany('teams', 'leader_id');
}
}