我在使用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"}}]
}
我的问题:在我将角色附加到用户模型之后,在我从数据库重新加载角色之前,它不会出现在模型中。我原以为它也会反映在模型的内存版本中。
答案 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_to
和has_one
关系中,因为只有一个模型关联,即使您不使用with
方法,也会得到相同的结果。但是在many
关系中(属于manstomany,hasmany,hasmany through),结果将取决于with
方法的使用。