在Laravel 4中向用户模型添加角色时出现问题
我在使用雄辩的模型时遇到了一些问题,不确定我是否遗漏了什么。我有一个用户模型和一个角色模型,在Laravel 4中建立了多对多关系在Laravel 4中向用户模型添加角色时出现问题,laravel,eloquent,Laravel,Eloquent,我在使用雄辩的模型时遇到了一些问题,不确定我是否遗漏了什么。我有一个用户模型和一个角色模型,在Laravel 4中建立了多对多关系 // Find a user with their roles (none at the moment) $user = User::with('roles')->find(2); var_dump($user->toJson()); 请注意空角色数组,这是预期的 { "id":"2","username":"Test","email":"test
// Find a user with their roles (none at the moment)
$user = User::with('roles')->find(2);
var_dump($user->toJson());
请注意空角色数组,这是预期的
{
"id":"2","username":"Test","email":"test@example.com","remember_token":"",
"roles":[]
}
接下来,我将角色附加到用户并再次显示该用户
$user->roles()->attach($role);
var_dump($user->toJson());
现在我们已将角色附加到用户,但角色数组仍然为空
{
"id":"2","username":"Test","email":"test@example.com","remember_token":"",
"roles":[]
}
如果我再次尝试获取用户,角色将显示良好,因此数据库将正确更新
$user = User::with('roles')->find(2);
var_dump($user->toJson());
{
"id":"2","username":"Test","email":"test@example.com","remember_token":"",
"roles":[{"id":"1","name":"Admin","pivot":{"user_id":"2","role_id":"1"}}]
}
我的问题是:为什么在我将角色附加到我的用户模型之后,直到我从数据库重新加载它,它才显示在模型中。我希望它也会反映在模型的内存版本中。因为
用户
有许多角色
,所以需要一个查询来获取所有角色。
例如,如果您将新角色附加到一个用户,而该用户已经有了另一个角色,那么就会出现混淆。
在调用attach
方法后,您可以尝试为模型设置属性,为此,请阅读
编辑
即使您传递了一个模型而不是id(使用save
method),它也不会被添加到集合中,我发现它更符合逻辑。因为正如我已经说过的,数据库和模型之间可能存在差异。让我更清楚地解释一下:
Role table
-------------
| id| name |
-------------
| 1 | admin |
-------------
| 2 | root |
-------------
role_user table
-----------------
|role_id|user_id|
-----------------
| 1 | 1 |
-----------------
| 2 | 1 |
-----------------
user table
-----------
|id| name |
-----------
| 1| razor|
-----------
现在,假设attach
(或save
)方法可以将模型添加到集合中
然后,您将在模型中添加
"roles":[{"id":"3","name":"another_role","pivot":{"user_id":"1","role_id":"3"}}]
这与数据库的结果相矛盾。此问题不会出现在
所属的中,并且具有一个关系,因为只有一个模型关联,即使不使用和方法,也会得到相同的结果。但是在many
关系(belongstomy,hasmany,hasmanythrough)中,结果将取决于与方法的使用。那么你是说我附加的新角色在从数据库重新加载之前不会显示在模型中吗?是的,但我不确定,也许有人能给出更好的解决方案是的,没错,附着的模型未添加到集合中。默认情况下,它不能添加到集合中,因为您可以传递简单的id
,而不是模型,因此它毕竟需要查询数据库。我发现这是一个bug,或者至少是一个雄辩的大矛盾,最好是在附加之后重新加载关系。
$user = User::find(2); // without "with('roles')"
//Then you add a new role
$role = new Role;
$role->name = 'another_role';
$user->roles()->save($role);
"roles":[{"id":"3","name":"another_role","pivot":{"user_id":"1","role_id":"3"}}]