我只需要获得角色名称为“ 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
答案 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个查询减少了范围:)