在我的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
现在我想获取团队表中未包含的名称。就像在这种情况下,坦维尔在场而纳伊姆不在场。我怎样才能获取这个名字(Nayeem)?
最佳答案
您可以通过两步完成这一切:
// 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();
Anwyay,如果 teams
表有一个 leader_id
外键,那就简单多了。原因有很多:
- 如果有两个具有
领导角色
且姓名相同的用户,但只有一个是团队领导
,该怎么办?上面的查询将排除两者。 - 如果有人由于输入错误等原因更改了名称怎么办?您还应该更改
leader_name
列,这会使您的代码更加复杂。 - 无论如何,外键更适合这些操作。
使用外键,您的查询将变为:
$users = User::whereHas('roles', function($query){
$query->where('name', '=', 'leader');
})->whereDoesntHave('leadership')->get();
例如,领导力
在您的用户
模型中定义为关系,如下所示:
public class User {
// [...]
public function leadership() {
return $this->hasMany('teams', 'leader_id');
}
}
关于mysql - 查找另一个表中未使用的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143366/