表users
和roles
通过role_user
作为数据透视表存在多对多的关系。
下面的代码语句通过id查找用户并成功更新第一个角色。
User::findOrFail(1)->roles[0]->update(['name'=>'Admin']);
使用以下代码,我打算更新与提供的user_id相关联的所有用户角色
User::findOrFail(1)->roles()->update(['name'=>'Admin']);
但我收到了以下错误
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'updated_at' in field list is ambiguous (SQL: update `roles` inner join `role_user` on `roles`.`id` = `role_user`.`role_id` set `name` = Admin, `updated_at` = 2018-02-06 09:06:30 where `role_user`.`user_id` = 1)
我理解User::findOrFail(1)->roles
是一个集合。
但User::findOrFail(1)->roles()
的返回值属于BelongsToMany
这是一个对象吗?为什么我们不能使用update()
方法?
答案 0 :(得分:2)
由于它是多对多关系,如果您只想为指定用户设置一个角色,则需要使用sync()
方法:
$user = User::find(1);
$roleId = Role::where('name', 'Admin')->value('id');
$user->roles()->sync([$roleId]);