Saltar a contenido

Seeders y Factories

Seeders

Los seeders o semilleros son una forma sencilla de agregar datos a tu base de datosEs especialmente útil durante el desarrollo en el que necesita llenar la base de datos con datos de muestra en vez de generarlos de manera manual. En definitiva, es el mecanismo que tenemos para generar esos datos de prueba que siempre necesitamos al inicio de la aplicación.

Generar un seeder

Para generar un seeder, que como puedes suponer no es más que un archivo, tenemos un comando de artisan:

php artisan make:seeder ‹NombreSeeder>

Los seeders se crean en database\seeders.

Programar el seeder

Un ejemplo de un seeder para las categorías sería:

CategorySeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

use App\Models\Category;

class CategorySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        DB::statement('SET FOREIGN_KEY_CHECKS=0');
        Category::truncate();
        DB::statement('SET FOREIGN_KEY_CHECKS=1');

        for ($i=0; $i < 20; $i++) { 
            Category::create(
                [
                    'title' => "Category $i",
                    'slug' => "category-$i",
                ]
            );
        }
    }
}

Ejecutar el seeder

Una vez definido, lo ejecutamos de la siguiente manera:

php artisan db:seed ‹NombreSeeder>

O ejecutamos todos los seeders que tengamos registramos en DatabaseSeeder.php:

php artisan db:seed 

Y con esto rellenamos la base de datos con datos de ejemplo que pueden ser útil para comprobar nuestra aplicación.

Factories

Aunque, los seeders son un mecanismo con el cual podemos generar múltiples datos de prueba, la realidad es que, generar múltiples datos de pruebas en relaciones más complejas como pueden ser los posts, no viene siendo la mejor opción, ya que, no tenemos un mecanismo sencillo para generar datos de prueba de forma variada y un esquema bien definido para generar N datos de prueba.

Los model factories proporcionan una manera fácil de definir múltiples datos que son predecibles y fáciles de replicar, lo que lo convierte en aliado para poder desarrollar las distintas fases de una aplicación e inclusive realizar pruebas.

Los model factories también utilizan el componente Faker el cual dispone de múltiples métodos que podemos usar para generar datos de prueba como nombres de personas, textos, números, telefónicos y un largo etc.

Generar una factory

Para generar un factory, que como puedes suponer no es más que un archivo, tenemos un comando de artisan:

php artisan make:factory ‹NombreFactory>

Los seeders se crean en database\factory.

Programar una factory

Un ejemplo de un factory para las categorías sería:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
 */
class PostFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        $name = $this->faker->name();
        return [
            'title' => $name,
            'slug' => str($name)->slug(),
            'content' => $this->faker->paragraph(20),
            'description' => $this->faker->paragraph(4),
            'category_id' => $this->faker->randomElement([1,2,3]),
            'posted' => $this->faker->randomElement(['yes','not']),
            'image' => $this->faker->imageUrl(),
        ];
    }
}

Ejecutar la factory

Una vez definido, debemos modificar el DatabaseSeeder.php incluyendo, dentro de la función run():

Post::factory(30)->create();

Luego solo quedaría ejecutar el seeder como hemos visto antes.

Actividades

  • ⚓ AR 730. (RA8 / CE8a / IC1 / 3p) - Sobre el proyecto de la lista de tareas, genera 3 categorías con factorías y 5 tareas con factorías.

  • 🧪 PR 731. (RA8 / CE8a / IC1 / 5p) - El CTO se ha dado cuenta que no tiene pedidos de ejemplo. Para ello te pide que realices todo lo necesario para poder visualizarlos, si te supone que crees nuevos controladores, hazlo. Además, tienes que tener como mínimo:

    • 10 pedidos
    • 5 clientes
    • 20 productos
  • 🏹 RE 732. (RA8 / CE8a CE8c CE8d CE8e CE8f CE8g / IC2 / 20p) Como cierre del reto, cada grupo realizará una presentación final del proyecto en la que se mostrará el funcionamiento de la aplicación desarrollada, se explicará la estructura del código y se justificarán las decisiones técnicas tomadas durante el desarrollo. Esta presentación servirá como verificación de la autoría y será una parte fundamental de la calificación del reto.

    Durante la exposición, se evaluarán los siguientes aspectos:

    • Funcionamiento real y completo del prototipo según los requisitos establecidos.
    • Claridad en la explicación del uso del patrón MVC, rutas y controladores.
    • Justificación del uso de roles y control de acceso.
    • Explicación del uso de migraciones, factorías y exportación de datos.
    • Organización del código y adecuación a las convenciones del framework.
    • Documentación técnica presentada junto con el proyecto.
    • Participación equitativa de los miembros del grupo.

    Además, al finalizar el reto y la presentación, cada alumno deberá completar una rúbrica de autoevaluación y tantas de coevaluación como compañeros tenga.