Bei Tests und beim Seeding müssen Datensätze in die Datenbank eingefügt werden.
Statt für jede Spalte einen Wert von Hand anzugeben, definieren Sie mit einer Model-Factory in Laravel einen Satz an Standardattributen pro Eloquent-Modell.Jede neue Laravel-Anwendung enthält die Datei database/factories/UserFactory.php.
namespace Database\Factories;use Illuminate\Database\Eloquent\Factories\Factory;use Illuminate\Support\Facades\Hash;use Illuminate\Support\Str;class UserFactory extends Factory{ // Das gleiche Passwort nicht jedes Mal neu hashen protected static ?string $password; public function definition(): array { return [ 'name' => fake()->name(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => static::$password ??= Hash::make('password'), 'remember_token' => Str::random(10), ]; }}
Über den Helper fake() steht die Bibliothek Faker zur Verfügung, mit der Sie verschiedenste Zufallsdaten erzeugen können.
Die Faker-Locale können Sie in config/app.php über die Option faker_locale ändern.
Wenn ein Modell das Trait HasFactory verwendet, findet Laravel die zugehörige Factory automatisch.
Gesucht wird im Namespace Database\Factories nach einer Klasse mit dem Namen des Modells plus Factory.Wenn die Namenskonvention nicht passt, können Sie die Zuordnung mit dem Attribut UseFactory explizit angeben.
use Illuminate\Database\Eloquent\Attributes\UseFactory;use Database\Factories\Administration\FlightFactory;#[UseFactory(FlightFactory::class)]class Flight extends Model{ // ...}
Mit afterMaking und afterCreating fügen Sie nach dem Erzeugen zusätzliche Verarbeitungsschritte hinzu.
namespace Database\Factories;use App\Models\User;use Illuminate\Database\Eloquent\Factories\Factory;class UserFactory extends Factory{ public function configure(): static { return $this->afterMaking(function (User $user) { // Nach make() ausgeführt (nicht in der DB gespeichert) })->afterCreating(function (User $user) { // Nach create() ausgeführt (bereits in der DB) }); } // ...}
Auch innerhalb einer State-Methode können Callbacks registriert werden.
public function withProfile(): static{ return $this->state(fn (array $attributes) => []) ->afterCreating(function (User $user) { $user->profile()->create([ 'bio' => fake()->paragraph(), ]); });}
use App\Models\User;// Ein Modell erzeugen$user = User::factory()->make();// Drei Modelle erzeugen (Rückgabe als Collection)$users = User::factory()->count(3)->make();
// Ein Modell erzeugen und speichern$user = User::factory()->create();// Drei Modelle erzeugen und speichern$users = User::factory()->count(3)->create();
Mit for() geben Sie das zugehörige Parent-Modell an.
use App\Models\Post;use App\Models\User;// Drei Beiträge für einen bestimmten Nutzer$posts = Post::factory() ->count(3) ->for(User::factory()->state(['name' => 'Tanaka Hanako'])) ->create();// Ein vorhandenes Modell als Parent verwenden$user = User::factory()->create();$posts = Post::factory()->count(3)->for($user)->create();
Wenn Sie in mehreren Relationen dieselbe Modellinstanz wiederverwenden möchten, nutzen Sie recycle().
// Dieselbe Airline bei Ticket und Flight verwendenTicket::factory() ->recycle(Airline::factory()->create()) ->create();// Zufällig aus einer Collection wählen$airlines = Airline::factory()->count(3)->create();Ticket::factory()->count(10)->recycle($airlines)->create();