如何在多对多关系 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
实例上。
如果您尝试获取具有属性roles
的user
,其中包含他所有角色的集合(数组),请执行以下操作:
$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 中检索所有相关模型?的主要内容,如果未能解决你的问题,请参考以下文章