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

时间:2019-09-28 04:29:56

标签: mysql eloquent laravel-6

在我的 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)?

1 个答案:

答案 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外键,那会简单得多。并且有很多原因:

  1. 如果有两个具有leader role且名称相同的用户,但是team leader只有一个用户怎么办?上面的查询将排除这两者。
  2. 如果有人由于例如输入错误而更改了名字,该怎么办?您还应该更改leader_name列,这会使您的代码更复杂。
  3. 无论如何,外键都更适合这些操作。

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

$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');
    }

}