Laravel更新多对多外键记录

时间:2016-11-13 09:29:07

标签: php mysql laravel

我有UserRoleUser_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表记录的情况下更新User_Role的角色?或者换句话说,如何更新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 个答案:

答案 0 :(得分: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]);