在Laravel 4中向用户模型添加角色时出现问题

时间:2014-05-26 15:23:05

标签: laravel eloquent

我在使用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@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"}}]
}

我的问题:在我将角色附加到用户模型之后,在我从数据库重新加载角色之前,它不会出现在模型中。我原以为它也会反映在模型的内存版本中。

1 个答案:

答案 0 :(得分:0)

由于user有许多role,因此您需要一个查询来获取所有角色。 例如,如果您将新角色附加到用户,并且该用户已经有另一个角色,则会出现混淆。 您可以在调用attach方法后尝试为模型设置属性,为此请阅读last thing on the Laravel Eloquent doc

protected $appends = array('local_roles');

修改

即使您传递模型而不是id(使用save方法),它也不会被添加到集合中,我觉得它更合乎逻辑。因为正如我已经说过的,它可能是数据库和模型之间的差异。让我更清楚地解释一下:

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)方法可以将模型添加到集合中。如果你这样做

$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"}}]
巫婆与数据库的结果相矛盾。此问题不会出现在belongs_tohas_one关系中,因为只有一个模型关联,即使您不使用with方法,也会得到相同的结果。但是在many关系中(属于manstomany,hasmany,hasmany through),结果将取决于with方法的使用。