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

Posted

技术标签:

【中文标题】如何在多对多关系 Laravel 中检索所有相关模型?【英文标题】:How to retrieve all related models in a many to many relationship Laravel? 【发布时间】:2019-03-03 12:41:43 【问题描述】:

我正在尝试通过中间表检索所有与另一个模型相关的模型,但不知道如何。 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 循环并获取与特定用户关联的所有角色,但我试图返回一个资源集合,所以我不能那样做

【问题讨论】:

尝试将get() 更改为first() 我收到一个错误,undefined method roles @hoolakoola 我认为您的角色和用户之间的关系不正确。 一般情况下Role与用户的关系为$this->hasMany(User::class);,也可以通过User::find($id)->roles; 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

用户

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】:

您的第二种方法的问题是在“Eloquent Query Builder”实例上调用 roles() 函数。您需要确保在“用户模型”上调用 roles() 函数。

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

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

可能的解决方案。

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

【讨论】:

这个答案有最需要的细节。无论如何,User::where('id', $user->id)->first() 可以简化为 User::find($id)【参考方案4】:

试试这个, 我假设 $user_id 是从 URL 传递到控制器的参数,

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

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

希望这可行

【讨论】:

【参考方案5】:

您收到错误的原因是因为在调用方法first()(或find()findOrFail())之前,实例是QueryBuilder。而roles() 方法只存在于User::class 实例上。

如果您尝试获取具有属性rolesuser,其中包含他所有角色的集合(数组),请执行以下操作:

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

希望这能让您有足够的洞察力来构建您需要的确切代码。

【讨论】:

以上是关于如何在多对多关系 Laravel 中检索所有相关模型?的主要内容,如果未能解决你的问题,请参考以下文章

在多对多关系中命名表 laravel

Django:在多对多关系中查找所有值,其中相关集合的所有元素都符合特定条件

“.”处或附近的QueryDSL语法错误在多对多的关系

在多对多关系 laravel4 的情况下更新数据透视表

如何在 Laravel 中检索链接到多对多关系的模型?

如何在laravel中从多对多关系中检索多个记录