2017-02-16 4 views
0

私はフィルター・ビルダー結果にattach()を使用したい:だからフィルタリングされたクエリ結果にLaravelのattach()を使用するには?

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    return $item->type == 1; 
}); 

$usersType_2 = $users->filter(function($item) { 
    return $item->type == 2; 
}); 

$usersType_1->role()->attach(3); 
$usersType_2->role()->attach(4); 

、私は、ユーザーtypeに基づいroleを添付する必要があります。 - 私はfilter()コレクションを返すため起こると仮定方法役割()存在しない:role()方法は

Userモデルで指定された上記のコードからattach()部分は次のエラーがスローされます。

フィルタリングされたBuilderの結果にピボットエントリをアタッチする方法はありますか?または、2つのクエリを実行してそれぞれattach()を実行する必要がありますか?

+0

役割()関数を使用すると、すべてが別のモデルに起こるコントローラ – Sona

+0

にそのモデルを抽出している存在ではありません。 'role()'メソッドは 'User'モデルで指定されています。 – lesssugar

+0

ユーザモデルにロール関数があります。 – Sona

答えて

0

理由だけでない。

$usersType_1 = $users->where('type', 1); // or whereType(1) 
$usersType_1->role()->attach(3); 

$usersType_2 = $users->where('type', 2); // or whereType(1) 
$usersType_2->role()->attach(4); 

は、私はあなたが雄弁コレクションをフィルタリングしているので、例外が発生し、「メソッドの役割は、()が存在しない」と思います。

編集:なぜこれが機能しないのか分かります。これは、コレクション全体をロールにアタッチしようとしているためです。 find()を使用して役割をアタッチした場合にはうまくいくはずです。あなたがrole方法がないコレクションの代わりに、Userモデルを使用することができませんでし

は、だから、タイプ1を持つすべてのユーザーをループと役割

foreach ($usersType_1 as $user) { 
    $user->role()->attach(3); 
} 
+0

残念ながら、同じエラーです。 – lesssugar

0

を添付しなければなりません。

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    if($item->type == 1) { 

     return $item->role()->attach(3); 
    } 
}) 
->all(); 

$usersType_2 = $users->filter(function($item) { 
    if($item->type == 2) { 

     return $item->role()->attach(4); 
    } 
}) 
->all(); 

オルタナティブ:で試してみてください

$users = User::whereIn('type', array(1, 2))->get(); 

$usersType_1 = $users->filter(function($item) { 
    $item->type == 1; 
}) 
->all(); 

$usersType_2 = $users->filter(function($item) { 
    return $item->type == 2; 
}) 
->all(); 

$role1 = Role::find(3); 
$role2 = Role::find(4); 

$role1->users()->attach($usersType_1->puck('id')); 

$role2->users()->attach($usersType_2->puck('id')); 
+0

これは基本的に 'attach()'が 'N '回使用されるループとして動作しませんか?はいの場合、私は両方のタイプのユーザーが多いと仮定するとそれほど効率的ではありません。 – lesssugar

+1

Alternativesは 'users'を' role'に割り当てます。まず、 'Role'が' users'を添付しているのを見つけてください。 – mrabbani

+0

これはいい考えです。ありがとう! – lesssugar

関連する問題