Wat zijn factories?
Bij tests en databaseseeding moet je records in de database invoegen. In plaats van handmatig de waarde van elke kolom op te geven, kun je met de modelfactories van Laravel een set standaardattributen definiëren voor elk Eloquent-model. Elke nieuwe Laravel-applicatie wordt geleverd metdatabase/factories/UserFactory.php.
fake()-helper heb je toegang tot de Faker-library, waarmee je allerlei willekeurige data kunt genereren.
De locale van Faker kun je wijzigen met de optie
faker_locale in config/app.php.Factories genereren
Maak een factory aan met het Artisan-commandomake:factory.
database/factories.
Automatische detectie van modellen en factories
Als je model deHasFactory-trait gebruikt, vindt Laravel automatisch de bijbehorende factory.
Er wordt in de namespace Database\Factories gezocht naar een klassennaam die bestaat uit de modelnaam met Factory erachter.
Als de naamgevingsconventie niet past, kun je de factory expliciet opgeven met het UseFactory-attribuut.
Factories definiëren
De definition()-methode
In de centrale definition()-methode van de factory definieer je de standaardattributen.
Factory-states
Met state-methoden kun je afzonderlijke wijzigingen op een factory definiëren.De soft-delete-state
Voor modellen die soft deletes ondersteunen, is de ingebouwdetrashed()-state beschikbaar.
Factory-callbacks
MetafterMaking en afterCreating definieer je extra logica na het genereren van een model.
Modellen genereren
make() — niet opslaan in de DB
create() — opslaan in de DB
Attributen overschrijven
Als je een array doorgeeft aanmake() of create(), kun je alleen specifieke attributen overschrijven.
Bij het genereren van modellen met een factory wordt de mass-assignment-bescherming automatisch uitgeschakeld.
Sequence
Wil je bij het genereren van meerdere modellen attributen afwisselen, gebruik danSequence.
sequence()-methode kun je dit beknopter schrijven.
Factories voor relaties
Has many (één-op-veel)
Met dehas()-methode genereer je een model met een “één-op-veel”-relatie.
has + de meervoudsvorm van de relatienaam).
Belongs to (omgekeerde relatie)
Met defor()-methode geef je het bovenliggende model op waartoe het model “behoort”.
Many to many (veel-op-veel)
Met dehasAttached()-methode werk je met veel-op-veel-relaties. Je kunt ook attributen voor de tussentabel opgeven.
Polymorfe relaties
Net als bij gewone “één-op-veel”-relaties kun jehas() of magic methods gebruiken.
morphTo-relaties kun je geen magic methods gebruiken. Geef de relatienaam expliciet op aan for().
Relaties binnen de factory definiëren
Als je indefinition() een andere factory toewijst aan een foreign key, wordt bij het genereren van het model automatisch ook het bovenliggende model gegenereerd.
recycle() — bestaande modellen hergebruiken
Wil je dezelfde modelinstantie hergebruiken in meerdere relaties, gebruik danrecycle().
Gebruik bij seeding
Roep factories aan vanuit deDatabaseSeeder of een seederklasse.
Gebruik in tests
In tests gebruik je factories in combinatie met deRefreshDatabase-trait.
RefreshDatabase de database bij elke test reset, interfereert data niet tussen tests.
Volgende stappen
Databaseseeding
Bekijk hoe je seeders en factories combineert om initiële data in te laden.
Introductie tot testen
Bekijk de testfunctionaliteit van Laravel en het gebruik van de RefreshDatabase-trait.