Skip to main content

Qu’est-ce qu’une factory

Pour les tests et le seeding, il faut insérer des enregistrements en base. Plutôt que d’indiquer manuellement chaque valeur, les factories de Laravel permettent de définir un jeu d’attributs par défaut pour chaque modèle Eloquent. Toute nouvelle application Laravel inclut database/factories/UserFactory.php.
Le helper fake() donne accès à Faker pour générer diverses données aléatoires.
La locale de Faker se change via l’option faker_locale de config/app.php.

Créer une factory

Utilisez la commande Artisan make:factory.
Le fichier est créé dans database/factories.

Détection automatique modèle / factory

Si votre modèle utilise le trait HasFactory, Laravel trouve automatiquement la factory correspondante. Il cherche dans le namespace Database\Factories une classe nommée modèle + Factory. Si le nommage diffère, spécifiez explicitement avec l’attribut UseFactory.

Définir une factory

Méthode definition()

Le cœur de la factory est la méthode definition(), qui retourne les attributs par défaut.
Méthodes Faker courantes :

États de factory

Les méthodes d’état définissent des variantes.
Les états peuvent se combiner.

État soft delete

Pour les modèles à suppression logique, l’état trashed() intégré est disponible.

Callbacks de factory

afterMaking et afterCreating permettent d’ajouter des traitements après la création du modèle.
Vous pouvez aussi enregistrer un callback dans une méthode d’état.

Créer des modèles

make() — Sans sauvegarde

create() — Avec sauvegarde en base

Surcharge d’attributs

Un tableau passé à make() ou create() surcharge des attributs précis.
Surcharge inline via state.
Lors d’une création via factory, la protection contre l’assignation en masse est désactivée automatiquement.

Sequence

Pour alterner des attributs lors de la génération, utilisez Sequence.
Version plus concise avec sequence().
Génération dynamique via une closure :

Factories et relations

Has Many (un à plusieurs)

has() crée un modèle avec une relation 1-N.
Version plus courte avec les méthodes magiques (has + pluriel du nom de la relation).

Belongs To (relation inverse)

for() désigne le parent auquel appartient le modèle.
Version magique :

Many to Many

hasAttached() gère les relations N-N, avec attributs de table pivot.
Version magique :

Relations polymorphes

Utilisez has() ou les méthodes magiques comme pour 1-N.
Pour morphTo, la méthode magique n’est pas disponible : nommez explicitement la relation dans for().

Définir une relation dans la factory

Dans definition(), si vous affectez une factory à une clé étrangère, le parent est créé automatiquement.

recycle() — Réutiliser un modèle existant

Pour réutiliser la même instance sur plusieurs relations, utilisez recycle().

Utilisation dans un seeder

Appelez la factory depuis DatabaseSeeder ou une autre classe de seeder.
Exécution :

Utilisation dans les tests

Dans un test, combinez avec RefreshDatabase.
RefreshDatabase réinitialise la base entre les tests, évitant les interférences.
L’API des factories est identique avec Pest. Utilisez uses(RefreshDatabase::class) pour réinitialiser la base.

Prochaines étapes

Seeding de base de données

Voyez comment combiner seeders et factories pour alimenter votre base.

Introduction aux tests

Découvrez la fonctionnalité de test de Laravel et le trait RefreshDatabase.
Dernière modification le 13 juillet 2026