Skip to main content

Qué son las factorías

En los tests y en el seeding de la base de datos necesitas insertar registros. En lugar de indicar manualmente los valores de cada columna, con las factorías de modelos de Laravel puedes definir un conjunto de atributos por defecto para cada modelo Eloquent. Todas las nuevas aplicaciones Laravel incluyen database/factories/UserFactory.php.
Con el helper fake() tienes acceso a la librería Faker, que genera todo tipo de datos aleatorios.
Puedes cambiar la localización de Faker con la opción faker_locale de config/app.php.

Generar una factoría

Crea una factoría con el comando Artisan make:factory.
La nueva clase se ubica en el directorio database/factories.

Detección automática de modelo y factoría

Si el modelo usa el trait HasFactory, Laravel localiza automáticamente su factoría. Busca dentro del namespace Database\Factories una clase cuyo nombre sea el del modelo con el sufijo Factory. Si la convención no coincide, indícalo explícitamente con el atributo UseFactory.

Definir una factoría

Método definition()

Los atributos por defecto se definen en el método definition().
Métodos de Faker más habituales:

Estados de la factoría (states)

Los métodos de estado permiten definir variantes concretas para la factoría.
Los estados se pueden combinar.

Estado de soft delete

En los modelos con soft delete dispones del estado integrado trashed().

Callbacks de la factoría

Los métodos afterMaking y afterCreating te permiten ejecutar lógica adicional tras generar el modelo.
También puedes registrar callbacks dentro de un método de estado.

Generar modelos

make(): sin guardar en la BD

create(): guarda en la BD

Sobrescribir atributos

Si pasas un array a make() o create(), se sobrescriben únicamente los atributos indicados.
También puedes usar state para sobrescribir de forma inline.
Al generar modelos con una factoría, la protección de asignación masiva se desactiva automáticamente.

Sequence

Cuando generas varios modelos y quieres alternar los valores, utiliza Sequence.
El método sequence() es una forma más concisa.
También puedes generar valores dinámicos con una closure.

Factorías de relaciones

Has Many (uno a muchos)

El método has() crea modelos con una relación «uno a muchos».
Con métodos mágicos (has + nombre en plural de la relación) queda más breve.

Belongs To (relación inversa)

Con for() indicas el modelo padre al que «pertenece».
Versión con métodos mágicos:

Many to Many (muchos a muchos)

Con hasAttached() gestionas las relaciones muchos a muchos. También puedes indicar atributos para la tabla pivote.
Versión con métodos mágicos:

Relaciones polimórficas

Puedes usar has() o los métodos mágicos igual que en un «uno a muchos» normal.
Las relaciones morphTo no admiten métodos mágicos. Debes indicar el nombre de la relación en for().

Definir relaciones dentro de la factoría

Si asignas otra factoría a una clave foránea en definition(), el modelo padre se genera automáticamente cuando se crea el hijo.

recycle(): reutilizar un modelo existente

Cuando quieras usar la misma instancia de un modelo en varias relaciones, utiliza recycle().

Uso en seeders

Puedes invocar las factorías desde DatabaseSeeder o desde otros seeders.
Ejecutar los seeders:

Uso en tests

En los tests las factorías se combinan con el trait RefreshDatabase.
RefreshDatabase reinicia la base de datos en cada prueba, evitando interferencias entre ellas.
La API de las factorías es igual cuando pruebas con Pest. Utiliza uses(RefreshDatabase::class) para reiniciar la base de datos.

Próximos pasos

Seeding de la base de datos

Aprende a combinar seeders y factorías para cargar datos iniciales.

Introducción a los tests

Descubre las herramientas de testing de Laravel y cómo usar el trait RefreshDatabase.
Última modificación el 13 de julio de 2026