gpt4 book ai didi

mysql - 查找另一个表中未使用的名称

转载 作者:行者123 更新时间:2023-11-29 09:33:46 25 4
gpt4 key购买 nike

在我的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 外键,那就简单多了。原因有很多:

  1. 如果有两个具有领导角色且姓名相同的用户,但只有一个是团队领导,该怎么办?上面的查询将排除两者。
  2. 如果有人由于输入错误等原因更改了名称怎么办?您还应该更改 leader_name 列,这会使您的代码更加复杂。
  3. 无论如何,外键更适合这些操作。

使用外键,您的查询将变为:

$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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com