2016-11-13 11 views
2

ユーザーとロールテーブルの間に多対多の関係を持つUserRole、および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_Roleのレコードを変更または削除せずにUserの役割を更新するにはどうすればよいですか?またはUser_Role.idを変更または削除せずにUser_Role.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の複数のペアを使用している場合あなたがupdateExistingPivot()

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

を試すことができます最初

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

答えて

2

をフィルタリングするために試してみました1行のみを更新する場合は、newPivotStatement()を使用してください。

@Yosua Lijanto Binarによって
$user->roles()->newPivotStatement()->where('id', $userRoleId)->update(['role_id' => $newRoleId]); 

そしてソリューション:

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

残念ながら、動作しません。 –

+0

あなたはあなたの質問を 'updateExistingPivot()'で更新しました。私はあなたの例で '$ userRoleId'が何であるのだろうか?これは古いロールIDですか? –

+0

User_Roleテーブルの主キーです。 –