我正在尝试通过中介表检索与另一个模型相关的所有相关模型,但不知道如何操作。 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循环并获取与特定用户相关的所有角色,但是我试图返回资源集合,所以我不能那样做
答案 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();
希望这能为您提供足够的见识,以构建所需的确切代码。