laravel 5.3 多对多关系 returns 仅在查询时关联角色
laravel 5.3 Many-to-Many relationship returns associated Role only when queried
我只是对它的工作原理感到困惑。
我在用户和角色之间有 M-M 关系。如果我像下面这样检索我的用户:-
$user = Auth::User();//->with('roles')->get();
$roleName = $user->roles[0]->name;
return $this->sendResponse('User retrieved successfully',$user);
我收到以下回复:
{
"success": true,
"message": "User retrieved successfully",
"data": {
"id": 2,
"name": "dummy",
"email": "dummy@dummy.com",
"created_at": "2017-05-06 09:49:50",
"updated_at": "2017-05-06 09:49:50",
"tenant_id": 2,
"roles": [
{
"id": 1,
"created_at": "2017-05-06 06:26:55",
"updated_at": "2017-05-06 06:26:55",
"name": "Admin",
"permissions": null,
"pivot": {
"user_id": 2,
"role_id": 1
}
}
]
}
}
但是,如果我将我的用户检索为:-
$user = Auth::User();//->with('roles')->get();
return $this->sendResponse('User retrieved successfully',$user);
我得到以下结果:-
{
"success": true,
"message": "User retrieved successfully",
"data": {
"id": 2,
"name": "Ali",
"email": "ali@and-or.com",
"created_at": "2017-05-06 09:49:50",
"updated_at": "2017-05-06 09:49:50",
"tenant_id": 2
}
}
为什么会这样?我希望 "first" 将结果发布到后一个查询。
其次,我在第一个查询后没有修改$user "method" 它是如何获得其角色附件的?
我确定有解释,但我无法确定。
检索模型时,在这种情况下,User
不会自动检索关系(因为在数据库端,这需要第二次查询,而您甚至可能不需要 roles
在某种情况下)。
在您的第一个示例中,通过 $roleName = $user->roles[0]->name;
访问角色,Laravel 自动执行 roles()
查询,并将角色对象添加到 User
(因此可以在以后再次访问它而无需重做查询)。这解释了为什么在第一个示例中角色 'magically' 附加到您的 User
模型。
在您的第二个示例中,此查询不会自动完成,因此您不会在响应中获得 roles
关系。
如果您想访问 User
s 角色,那么您可以像在您的评论中那样使用 with()
方法来预先加载关系,但请记住,这意味着做第二个查询是为了从数据库中获取此数据。
另一种选择,如果您总是希望User
模型附加其Roles
,则将roles
添加到$appends
模型数组:
protected $appends = ['roles'];
这告诉 Laravel roles
属性是您始终希望在您的模型上可用的属性,然后它会执行必要的操作以实现这一点(在这种情况下,查询关系).
我只是对它的工作原理感到困惑。
我在用户和角色之间有 M-M 关系。如果我像下面这样检索我的用户:-
$user = Auth::User();//->with('roles')->get();
$roleName = $user->roles[0]->name;
return $this->sendResponse('User retrieved successfully',$user);
我收到以下回复:
{
"success": true,
"message": "User retrieved successfully",
"data": {
"id": 2,
"name": "dummy",
"email": "dummy@dummy.com",
"created_at": "2017-05-06 09:49:50",
"updated_at": "2017-05-06 09:49:50",
"tenant_id": 2,
"roles": [
{
"id": 1,
"created_at": "2017-05-06 06:26:55",
"updated_at": "2017-05-06 06:26:55",
"name": "Admin",
"permissions": null,
"pivot": {
"user_id": 2,
"role_id": 1
}
}
]
}
}
但是,如果我将我的用户检索为:-
$user = Auth::User();//->with('roles')->get();
return $this->sendResponse('User retrieved successfully',$user);
我得到以下结果:-
{
"success": true,
"message": "User retrieved successfully",
"data": {
"id": 2,
"name": "Ali",
"email": "ali@and-or.com",
"created_at": "2017-05-06 09:49:50",
"updated_at": "2017-05-06 09:49:50",
"tenant_id": 2
}
}
为什么会这样?我希望 "first" 将结果发布到后一个查询。
其次,我在第一个查询后没有修改$user "method" 它是如何获得其角色附件的?
我确定有解释,但我无法确定。
检索模型时,在这种情况下,User
不会自动检索关系(因为在数据库端,这需要第二次查询,而您甚至可能不需要 roles
在某种情况下)。
在您的第一个示例中,通过 $roleName = $user->roles[0]->name;
访问角色,Laravel 自动执行 roles()
查询,并将角色对象添加到 User
(因此可以在以后再次访问它而无需重做查询)。这解释了为什么在第一个示例中角色 'magically' 附加到您的 User
模型。
在您的第二个示例中,此查询不会自动完成,因此您不会在响应中获得 roles
关系。
如果您想访问 User
s 角色,那么您可以像在您的评论中那样使用 with()
方法来预先加载关系,但请记住,这意味着做第二个查询是为了从数据库中获取此数据。
另一种选择,如果您总是希望User
模型附加其Roles
,则将roles
添加到$appends
模型数组:
protected $appends = ['roles'];
这告诉 Laravel roles
属性是您始终希望在您的模型上可用的属性,然后它会执行必要的操作以实现这一点(在这种情况下,查询关系).