Models richtig recyclen in Eloquent Factories
Heute hatte ich ein kleines Verständnisproblem in meinem Seeder und wollte daher mal notieren, wie es richtig geht.
Folgendes Problem: Ich habe, sagen wir mal, ein Model Post
, das eine user_id
hat.
Wenn ich nun ganz viele Posts
in die Datenbank seede, möchte ich zwar, dass jeder mit einem User
verbunden ist, aber ich will nicht, dass jeder Post
auch seinen ganz eigenen User
erstellt. Da kommt nun die recycle
-Methode zur Anwendung
// PostFactory.php
public function definition(): array
{
return [
'text' => 'Hallo!',
'user_id' => User::factory(),
];
}
// DatabaseSeeder.php
$users = User::factory()->count(10)->create();
Post::factory()
->recycle($users)
->count(100)
->create();
Nutzt man bei der PostFactory, wie dargestellt, nun recycle
, führt das dazu, dass er die entsprechenden Models nutzt, statt Neue zu erstellen, wie toll ist das denn!
Damit der Post nicht nur hilfreich, sondern auch unterhaltsam ist, hier noch den Fehler, den ich machte, weshalb alles nicht funktionierte:
// DatabaseSeeder.php
$users = User::factory()->count(10)->create();
Post::factory()
->recycle($users)
->for(User::factory())
->count(100)
->create();
Ich versuchte recycle
gemeinsam mit for
zu benutzen. Das klappt zwar an sich auch, aber jeder Post
bekommt leider den gleichen User
, weil das for
für alles gilt, was aus der Factory fällt. Ist also gar kein Fehler von recycle
, sondern nur ganz allein meiner.