Laravel以多对多关系更新所有记录

时间:2018-02-06 09:21:42

标签: php laravel

usersroles通过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()方法?

1 个答案:

答案 0 :(得分:2)

由于它是多对多关系,如果您只想为指定用户设置一个角色,则需要使用sync()方法:

$user = User::find(1);
$roleId = Role::where('name', 'Admin')->value('id');
$user->roles()->sync([$roleId]);