通过查询在Laravel中的关系来过滤记录

时间:2019-01-01 07:55:38

标签: laravel laravel-query-builder

我只需要获得角色名称为“ Team Leader”的那些用户。

user table : role_id
role_table : role_name

例如:

   $role = Role::where('name', 'Team Leader')->first();
   $team_leaders = User::where('role_id',$role->id)->get();

我该如何直接通过关系查询来做到这一点。感谢Advanve

3 个答案:

答案 0 :(得分:4)

在用户模型中,您应该添加关联方法“角色”

class User extends Authenticatable
{

   public function role()
   {
     return $this->belongsTo(Role::class, 'role_id');
   }

}

然后您可以做:

User::whereHas('role', function ($query) {
    $query->where('role_name', '=', 'Team Leader');
})->get();

答案 1 :(得分:3)

您可以定义一对多关系, 在您的榜样中,

class Role extends Model
{
   public function users()
   {
     return $this->hasMany(User::class, 'role_id');
   }

}

在您的用户模型中,

class User extends Authenticatable
{

   public function role()
   {
     return $this->belongsTo(Role::class, 'role_id');
   }

}

现在您可以获取组长的用户列表,

$role = Role::where('name', 'Team Leader')->first();
$team_leaders = $role->users;

更多信息,您可以查看:https://laravel.com/docs/5.7/eloquent-relationships#one-to-many

答案 2 :(得分:1)

一种执行此操作的方法是通过Query Scopes

例如:

public function scopeTeamLeader($query)
{
    $role = Role::whereName('Team Leader')->first();

    return $query->where('role_id', $role->id);
}

要查询同时也是团队负责人的用户,您可以执行以下操作

User::latest()
    ->TeamLeader()
    ->get(); 

我可能还会在“ App \ Role”类中定义一些类常量。 例如。

class Role 
{
    const TEAM_LEADER = 1; 
}

然后可以像这样清理以下内容:

public function scopeTeamLeader($query)
{
    return $query->where('role_id', Role::TEAM_LEADER);
}

很明显,这只是个人喜好,并不适用于所有地方,但是我认为它确实提高了可读性,并且通过1个查询减少了范围:)