2016-11-13 88 views
2

我有User,RoleUser_Role表,其中包含User和Role表之间的多对多关系。Laravel更新多对多外键记录

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_idrole_id

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

回答

2

您可以尝试updateExistingPivot()

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

只想更新一行,尽量使用newPivotStatement()

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

与解决@Yosua Lijanto BINAR:

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

遗憾的是,不能正常工作。 –

+0

哦,你用'updateExistingPivot()'更新了你的问题。我想知道你的例子中'$ userRoleId'是什么?这是一个旧的角色ID? –

+0

它是User_Role表的主键。 –