Skip to main content

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 met database/factories/UserFactory.php.
Via de 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-commando make:factory.
De nieuwe factoryklasse wordt geplaatst in de map database/factories.

Automatische detectie van modellen en factories

Als je model de HasFactory-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.
Een overzicht van veelgebruikte Faker-methoden:

Factory-states

Met state-methoden kun je afzonderlijke wijzigingen op een factory definiëren.
States kun je combineren.

De soft-delete-state

Voor modellen die soft deletes ondersteunen, is de ingebouwde trashed()-state beschikbaar.

Factory-callbacks

Met afterMaking en afterCreating definieer je extra logica na het genereren van een model.
Je kunt ook binnen state-methoden callbacks registreren.

Modellen genereren

make() — niet opslaan in de DB

create() — opslaan in de DB

Attributen overschrijven

Als je een array doorgeeft aan make() of create(), kun je alleen specifieke attributen overschrijven.
Inline overschrijven met een state is ook mogelijk.
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 dan Sequence.
Met de sequence()-methode kun je dit beknopter schrijven.
Je kunt ook met een closure dynamisch willekeurige waarden genereren.

Factories voor relaties

Has many (één-op-veel)

Met de has()-methode genereer je een model met een “één-op-veel”-relatie.
Met magic methods kun je dit beknopter schrijven (has + de meervoudsvorm van de relatienaam).

Belongs to (omgekeerde relatie)

Met de for()-methode geef je het bovenliggende model op waartoe het model “behoort”.
De variant met magic methods:

Many to many (veel-op-veel)

Met de hasAttached()-methode werk je met veel-op-veel-relaties. Je kunt ook attributen voor de tussentabel opgeven.
De variant met magic methods:

Polymorfe relaties

Net als bij gewone “één-op-veel”-relaties kun je has() of magic methods gebruiken.
Voor morphTo-relaties kun je geen magic methods gebruiken. Geef de relatienaam expliciet op aan for().

Relaties binnen de factory definiëren

Als je in definition() 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 dan recycle().

Gebruik bij seeding

Roep factories aan vanuit de DatabaseSeeder of een seederklasse.
De seeder uitvoeren:

Gebruik in tests

In tests gebruik je factories in combinatie met de RefreshDatabase-trait.
Omdat RefreshDatabase de database bij elke test reset, interfereert data niet tussen tests.
Ook bij het testen met Pest is de factory-API hetzelfde. Gebruik uses(RefreshDatabase::class) om de database te resetten.

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.
Laatst gewijzigd op 6 september 2026