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 incluyendatabase/factories/UserFactory.php.
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 Artisanmake:factory.
database/factories.
Detección automática de modelo y factoría
Si el modelo usa el traitHasFactory, 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().
Estados de la factoría (states)
Los métodos de estado permiten definir variantes concretas para la factoría.Estado de soft delete
En los modelos con soft delete dispones del estado integradotrashed().
Callbacks de la factoría
Los métodosafterMaking y afterCreating te permiten ejecutar lógica adicional tras generar el modelo.
Generar modelos
make(): sin guardar en la BD
create(): guarda en la BD
Sobrescribir atributos
Si pasas un array amake() o create(), se sobrescriben únicamente los atributos indicados.
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, utilizaSequence.
sequence() es una forma más concisa.
Factorías de relaciones
Has Many (uno a muchos)
El métodohas() crea modelos con una relación «uno a muchos».
has + nombre en plural de la relación) queda más breve.
Belongs To (relación inversa)
Confor() indicas el modelo padre al que «pertenece».
Many to Many (muchos a muchos)
ConhasAttached() gestionas las relaciones muchos a muchos. También puedes indicar atributos para la tabla pivote.
Relaciones polimórficas
Puedes usarhas() o los métodos mágicos igual que en un «uno a muchos» normal.
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 endefinition(), 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 desdeDatabaseSeeder o desde otros seeders.
Uso en tests
En los tests las factorías se combinan con el traitRefreshDatabase.
RefreshDatabase reinicia la base de datos en cada prueba, evitando interferencias entre ellas.
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.