2017-11-15 13 views
0

私はUserモデルとNotificationモデルで多対多の関係を持っています。Laravelはループなしで多対多の関係にある多くのオブジェクトにオブジェクトを添付します

通知を作成し、多くのユーザーに接続するために、私は現在やっている:

$users = User::all(); 
$notification = new Notification(['title'=>'some title', 'body'=>'notification body']); 
$notification->save(); 
foreach ($users as $user) { 
    $user->notifications()->attach([$notification->id]); 
} 

$users->count()が非常に多くなった場合foreachの実装が理想的ではないでしょう。 多くのループがなくてもこれを行うには良い方法はありますか?

ありがとう

答えて

1

こちらをご覧ください:https://laravel.com/docs/5.4/eloquent-relationships#updating-many-to-many-relationships

あなたはとても似attach()メソッドにIDの配列を渡すことができます。

$user_ids = User::pluck('id'); 
$notification = new Notification(['title'=>'some title', 'body'=>'notification body']); 
$notification->save(); 
$notification->users()->attach($user_ids); 

$notification上のあなたの関係がusers()と呼ばれていると仮定すると、当然のことながら

1

いいえ、Eloquentを使用していません。

attach複数のレコードが同時に存在しますが、これは内部的にループ自体を使用しているため、そこでは何も保存していません。

大きな結果セットを処理する場合、Eloquentは必ずしも理想的なソリューションではありません。一括挿入操作を処理するためにデータベースクエリビルダまたは生のSQLを使用することを検討することもできます。

+0

私はin-deptの説明に感謝します。私はEloquentがこれにループを使用することは全く考えていませんでした。私はいつもそれがいくつかのSQLの大量挿入クエリを介して行われたと思った。 – Sam

+0

ソースコードを調べることは常に価値があります。あるいは、何かがどのように働くかについて多くを学ぶことができます。この場合、[このファイル](https://github.com/illuminate/database/blob/master/Eloquent/Relations/Concerns/InteractsWithPivotTable.php)の 'formatAttachRecords'メソッドを探します。私は自分の電話にいるので、正確な行番号にリンクすることはできません。 – fubar

0
$users = User::all(); 

$notification = Notification::create([ 
    'title'=>'some title', 
    'body'=>'notification body' 
]); 

$notification->user()->attach($users); 
関連する問題