例えば、usersとticketsがあって、user_ticketsとういうテーブルがあったとしましょう。
以下のように、固有のチケットに対して複数のIDを付与したい場合
$users = User::factory(10)->create();
Ticket::factory()->create()->attach($users->pluck('id'));
こういった形になると思います。
attachの第2引数はattributesを指定できるので、
$users = User::factory(10)->create();
Ticket::factory()->create()->attach($users->pluck('id'), ['foo' => 'bar']);
といったように、user_tickets
の別カラム(foo)に対して一律でbar
を設定することができます。
ただ、10件のユーザーがあったとして、それぞれで番号を切り替えたいといった要求の場合、この第2引数では解決できません。
こういった際、どうしたら良いかというと第1引数をkey=>value
な形式にして差し込むことで値を入れることが可能です。
$users = [
1 => ['foo' => 'bar'],
2 => ['foo' => 'baz'],
3 => ['foo' => 'aaa'],
];
Ticket::factory()->create()->attach($users);
ModelFactoryのように、テストの用途でこういうことをしたい場合、以下のような感じにできます。
もちろん、UserTicketFactoryのようなものを用意する方法でも良さそうです。
例としては、番号をインクリメントさせてくことで、番号が一意であるようにするパターンです。
$sequence = 1;
$users = User::factory(10)->create()->pluck('id')->flip()->map(function() use (&$sequence)) {
return ['index' => $sequence++];
}
Ticket::factory()->create()->attach($users);
チェーンが長くなってしまってますが、pluckでidのリストを抽出し、flipを利用してidをkeyに変換。mapで対象に値をセットしています。
(実際このパターンだと、mapメソッドの引数にvalue(元々keyだったものをひっくり返した数値)があるはずなので、それを利用するだけでも良さそうです)
おわり。