Как получить все связанные модели в отношениях «многие ко многим» Laravel? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь получить все связанные модели с другой моделью через промежуточную таблицу, но не могу понять, как.Документы Laravel говорят, что вы можете сделать что-то вроде этого:

$roles = App\User::find(1)->roles()->orderBy('name')->get();

Но когда я пытаюсь применить это к моему коду

$roles = User::where('id', $user->id)->roles()->get();

Это не работает.Я принимаю пользовательскую модель через свой контроллер, поэтому у меня есть к ней доступ.

Отношение также определяется следующим образом:

User

public function roles()
{
    return $this->belongsToMany(Role::class);
}

Role

public function users()
{
    return $this->belongsToMany(User::class);
}

Как мне получить все роли, связанные с конкретным пользователем?

edit / update: я знаю, что могу просто использовать цикл foreach и получить всероли, связанные с конкретным пользователем, но я пытаюсь вернуть коллекцию ресурсов, поэтому я не могу сделать это таким образом

Ответы [ 5 ]

0 голосов
/ 27 сентября 2018

Причина, по которой вы получаете ошибки, заключается в том, что перед вызовом метода first() (или find() или findOrFail()) экземпляр является QueryBuilder.и метод roles() существует только в экземпляре User::class.

, если вы пытаетесь получить user с атрибутом roles, содержащим коллекцию (массив) всех его ролей:

$user = User::where('id', $user->id)->with('roles')->first();

если вам нужен только массив ролей, у вас есть два варианта;либо получите пользователя, а затем получите его роли:

$user = App\User::find($userId);
$roles = $user->roles()->orderBy('name')->get();
//the same as
$roles = App\User::find($userId)->roles()->orderBy('name')->get();

или получите роли (только один запрос)

$roles = Role::whereHas('users', function($users) use($userId) {
    $users->where('id','=',$userId);
})->get();

Надеюсь, что это даст вам достаточно знаний, чтобы построить именно тот код, который вам нужен.

0 голосов
/ 27 сентября 2018

Попробуйте, я предполагаю, что $ user_id - это параметр, который передается в контроллер из URL,

$ role = User :: findOrFail ($ user_id) -> role;

Но перед тем, как запустить приведенный выше код, я предполагаю, что вы создали сводную таблицу для связи "многие ко многим" со столбцами user_id и role_id.И назвали сводную таблицу как role_user.

Надеюсь, что это работает

0 голосов
/ 27 сентября 2018

Пользователь

use App\User;
public function roles()
{
   return $this->belongsToMany('App\Users', 'user_id');
}

Роль

use App\Roles;
public function users()
{
    return $this->belongsToMany('App\Roles');
}

Контроллер

$roles = User::where('id', $user->id)->roles()->get();

Попробуйте это.Я думаю, что ваши отношения не верны.

Вы можете прочитать больше информации здесь Многие ко многим

0 голосов
/ 27 сентября 2018

проблема с вашим вторым подходом заключается в вызове функции roles() в экземпляре Eloquent Query Builder.Вы должны обязательно вызвать функцию roles() для «Пользовательской модели».

эта часть кода User::where('id', $user->id) не не возвращает «Пользовательскую модель».

Чтобы получить пользовательскую модель из экземпляра Query Builder, необходимо вызвать функцию first().

возможное решение.

$roles = User::where('id', $user->id)->first()->roles;
0 голосов
/ 27 сентября 2018

Следующее решение можно использовать для извлечения всех связанных моделей в отношениях «многие ко многим» в Laravel:

$roles = User::where('id', $user->id)->get();
 foreach($roles as $rol){
  $rol->roles;
 }
...