knuspermagier.de
Ein L und zwei P. Philipp!

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.

Kommentare, Feedback und andere Anmerkungen?
Schreib mir eine E-Mail 🤓