Laravel 更新多对多外键记录

3

我有三个表,分别是 User(用户)、Role(角色)和 User_Role(用户-角色),其中 User 和 Role 表之间存在多对多的关系。

class User extends Model {
    public function roles {
        return $this->belongsToMany('App\Role');
    }
}

class Role extends Model {
    public function users {
        return $this->belongsToMany('App\User');
    }
}

User
- id
- other_columns

Role
- id
- other_columns

User_Role
- id
- user_id
- role_id
- other_columns

User_Role可以有多个相同的记录,但Role_User.id不同。

如何在不更改或删除User_Role表记录的情况下更新User的角色?或者换句话说,如何更新User_Role.role_id而不更改或删除User_Role.id

我已经尝试过:

$user->roles()->updateExistingPivot($userRoleId, ['role_id' => $newRoleId]);

并且

$user->roles()->sync($userRoleId, ['id' => $userRoleId, 'role_id' => $newRoleId, 'user_id' => $userId]);

但它们不起作用。

更新

这段代码可以工作,但它也会更改其他记录。

$user->roles()->updateExistingPivot($oldRoleId, ['role_id' => $newRoleId]);

我尝试了先进行过滤

$user->roles()->wherePivot('id', $userRoleId)->updateExistingPivot($oldRoleId, ['role_id' => $newRoleId]);
1个回答

2
你可以尝试使用 updateExistingPivot() 方法来更新多对多关系。
$user->roles()->updateExistingPivot($roleId, ['role_id' => $newRoleId]);

如果您正在使用多个完全相同的user_idrole_id对,并且您只想更新一行,请尝试使用newPivotStatement()

$user->roles()->newPivotStatement()->where('id', $userRoleId)->update(['role_id' => $newRoleId]);

以下是@Yosua Lijanto Binar提供的解决方案:

$user->roles()->wherePivot('id', $userRoleId)->updateExistingPivot($oldRoleId, ['role_id' => $newRoleId]);

哦,你在问题中更新了updateExistingPivot()。我想知道你的例子中$userRoleId是什么?它是旧的角色ID吗? - Alexey Mezenin
这是User_Role表的主键。 - Yosua Lijanto Binar
那么,这是数据透视表中的“id”列吗?如果是,尝试使用旧的角色ID。 - Alexey Mezenin
是的,谢谢,它可以工作。但它也会改变其他相同的记录。例如:User_Role(id->1, user_id->1, role_id->1)User_Role(id->2, user_id->2, role_id->2),然后我运行那段代码。它会更改两个记录。有什么解决办法吗? - Yosua Lijanto Binar
你的意思是有两行数据的 user_idrole_id 是相同的吗? - Alexey Mezenin
1
谢谢,它有效。同时,由于你在更新的问题中,我也有了自己的解决方案。请在你的答案中添加它们。 - Yosua Lijanto Binar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,