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

标签 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

现在我想获取团队表中未包含的名称。就像在这种情况下,坦维尔在场而纳伊姆不在场。我怎样才能获取这个名字(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/

相关文章:

php - 如何安装 Laravel 5.8

laravel - 解密模型值的访问器不起作用

mysql - mysql 查询创建 View 时出现问题

php - 存储获取和存储IP地址

laravel - Laravel 中返​​回 ResourceCollection 时如何返回 HTTP 状态代码

laravel - 是否有可能拥有比两个级别更深的 HasManyThrough 关系?

mysql - SQL 查询缓存

php - MYSQL查询特定行

mysql - 从 Laravel 5.1 升级到 Laravel 5.8 后,whereHas() 速度变慢

php - Laravel 动态创建多个数据库的方法