2017-03-06 4 views
1

マイピボットテーブルは3列の合計が含ま:Laravel - ピボットテーブルのサブセットのみ同期が

  • USER_ID

グループROLE_IDはちょうど整数です。私は、ユーザーとその役割を同期することができますが、特定のグループに属するものだけを同期できたいと考えています。

シンプルな同期([1,2,3])を実行すると、ピボットテーブルからすべてが削除され、グループは完全に無視されます。

オプション:

  1. がUserRolesための新しいモデルを作成し

    は、私は心の中でいくつかのソリューションを持っています。
  2. UserRoles::where('group', '=', '1');
  3. User::roles()->detach(list_of_ids_from_previous_query);
  4. User::roles()->attach(list_of_desired_ids_for_group_1);

オプションB:

  1. User::roles()->all();
  2. ファンシー$list_of_ids_from_previous_query
  3. User::roles()->sync(list_of_merged_ids);$list_of_desired_ids_for_group_1マージ

Eloquentでこれを行う別の方法はありますか?私はIDとグループの2つの多次元配列をマージする必要がないので、実装する方が簡単です(a)。しかし、オプション(a)は、すべてのグループ行に対してDELETEとINSERTを実行する必要があるため、データベース集約的である可能性があります。

答えて

1

Laravel sync()メソッドを模倣しましたが、追加のフィルタリングが追加されました。メソッドを自分のリポジトリに追加しましたが、メソッドとしてモデルに追加することができます。

あなたがモデルにメソッドを移動したい場合は、あなたがこのような何か行うことができます:

/** 
* Simulates the behaviour of Eloquent sync() but 
* only on a specific subset of the pivot 
* @param integer $group 
* @param array $roles 
* @return Model 
*/ 
public function syncBy($group, array $roles) 
{ 
    // $this is the User model for example 
    $current = $this->roles->filter(function($role) use ($group) { 
     return $role->pivot->group === $group; 
    })->pluck('id'); 

    $detach = $current->diff($roles)->all(); 

    $attach_ids = collect($roles)->diff($current)->all(); 
    $atach_pivot = array_fill(0, count($attach_ids), ['group' => $group]); 
    $attach = array_combine($attach_ids, $atach_pivot); 

    $this->roles()->detach($detach); 
    $this->roles()->attach($attach); 

    return $this; 
} 

使用法:

$user= App\User::find(1); 
// Will sync for user 1, the roles 5, 6, 9 but only within group 3 
$user->syncBy(3, [5, 6, 9]); 
関連する問題