如何在多对多关系Laravel中检索所有相关模型?

时间:2018-09-27 14:48:51

标签: laravel many-to-many relationship

我正在尝试通过中介表检索与另一个模型相关的所有相关模型,但不知道如何操作。 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);
}

如何获取与特定用户相关的所有角色?

编辑/更新: 我知道我可以简单地使用foreach循环并获取与特定用户相关的所有角色,但是我试图返回资源集合,所以我不能那样做

5 个答案:

答案 0 :(得分:1)

第二种方法的问题是在“雄辩的查询生成器”实例上调用roles()函数。您需要确保在“用户模型”上调用roles()函数。

这部分代码User::where('id', $user->id) 不会返回“用户模型”。

要从“查询生成器”实例中获取“用户模型”,您需要调用first()函数。

可能的解决方案。

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

答案 1 :(得分:0)

您可以使用以下解决方案在Laravel中以多对多关系检索所有相关模型:

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

答案 2 :(得分:0)

用户

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();

尝试这个。我认为您的关系不正确。

您可以在Many To Many

处阅读更多信息。

答案 3 :(得分:0)

尝试一下, 我假设$ user_id是从URL传递到控制器的参数,

  

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

但是在运行上面的代码之前,我假设您已经使用列user_id和role_id为多对多关系创建了数据透视表。并将数据透视表命名为role_user。

希望这行得通

答案 4 :(得分:0)

出现错误的原因是,在调用方法first()(或find()findOrFail())之前,实例是QueryBuilder。和roles()方法仅存在于User::class实例上。

如果您要获取带有属性user的{​​{1}},该属性包含他所有角色的集合(数组),请执行以下操作:

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();

希望这能为您提供足够的见识,以构建所需的确切代码。