Was ist eine Factory?
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 Dateidatabase/factories/UserFactory.php.
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.Factory erzeugen
Erzeugen Sie eine Factory über den Artisan-Befehlmake:factory.
database/factories abgelegt.
Automatische Erkennung von Modell und Factory
Wenn ein Modell das TraitHasFactory 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.
Factory definieren
Methode definition()
Die zentrale Methode definition() liefert die Standardattribute.
Factory States
Mit State-Methoden definieren Sie einzelne Varianten einer Factory.State für Soft Deletes
Für Modelle mit Soft Deletes steht der eingebaute Statetrashed() bereit.
Factory-Callbacks
MitafterMaking und afterCreating fügen Sie nach dem Erzeugen zusätzliche Verarbeitungsschritte hinzu.
Modelle erzeugen
make() – nicht in der DB speichern
create() – in der DB speichern
Attribute überschreiben
Übergeben Sie anmake() oder create() ein Array, um einzelne Attribute zu überschreiben.
Beim Erzeugen von Modellen über eine Factory wird der Schutz vor Mass Assignment automatisch deaktiviert.
Sequence
Wenn Sie beim Erzeugen mehrerer Modelle Attribute abwechselnd variieren möchten, verwenden SieSequence.
sequence() bietet eine kürzere Schreibweise.
Factories für Relationen
Has Many (1:n)
Mithas() erzeugen Sie ein Modell mit einer 1:n-Relation.
has + Plural-Form des Beziehungsnamens).
Belongs To (umgekehrte Relation)
Mitfor() geben Sie das zugehörige Parent-Modell an.
Many to Many (n:m)
Für n:m-Beziehungen verwenden SiehasAttached(). Auch Attribute der Zwischentabelle können angegeben werden.
Polymorphe Relationen
Wie bei einer normalen 1:n-Relation können Siehas() oder die Magic-Methoden verwenden.
morphTo-Relationen stehen keine Magic-Methoden zur Verfügung. Geben Sie den Beziehungsnamen explizit an for() weiter.
Relationen in der Factory
Weisen Sie indefinition() einem Fremdschlüssel eine andere Factory zu, wird beim Erzeugen des Modells automatisch auch das Parent-Modell angelegt.
recycle() – bestehende Modelle wiederverwenden
Wenn Sie in mehreren Relationen dieselbe Modellinstanz wiederverwenden möchten, nutzen Sierecycle().
Verwendung beim Seeding
Rufen Sie Factories imDatabaseSeeder oder aus einer Seeder-Klasse heraus auf.
Verwendung in Tests
In Tests kombinieren Sie Factories mit dem TraitRefreshDatabase.
RefreshDatabase setzt die Datenbank zwischen den Tests zurück, damit sich die Daten der einzelnen Tests nicht gegenseitig beeinflussen.
Nächste Schritte
Datenbank-Seeding
Erfahren Sie, wie Sie Seeder und Factories kombinieren, um initiale Daten einzuspielen.
Einführung in Tests
Vertiefen Sie die Test-Funktionen von Laravel und die Nutzung des
RefreshDatabase-Traits.