Фильтрация записей по запросу об отношениях в Laravel - PullRequest
0 голосов
/ 01 января 2019

Мне нужно получить только тех пользователей, у которых есть роль «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 голосов
/ 01 января 2019

Вы можете определить отношение один ко многим. В вашей модели роли

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

0 голосов
/ 01 января 2019

IN Модель пользователя, вы должны добавить метод отношения 'role'

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();
0 голосов
/ 01 января 2019

Один из способов сделать это - Область запросов .

Например:

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 запрос:)

...