Ir al contenido principal

Laravel 8 desde cero Parte VI - creando seeders o semilleros

 Laravel 8 desde cero Parte VI - creando seeders o semilleros

Introducción

Los semilleros o seeders, son un recurso en Laravel para alimentar las tablas en nuestra base de datos, con datos aleatorios o fijos según el caso.
Generalmente se usan para probar nuestro desarrollo con un número de datos mayor, sin tener que ingresar uno a uno en los formularios dichos datos.
Aunque de momento no hemos incluido Tema y Roll en el proyecto del Blog VIP, en el próximo artículo los incluiremos, por lo que incluyo dichas tablas (modelo, y migración) aquí (al igual que sus semilleros).

Creando modelo, migración y semilleros fijos para Tema y Roll

Para crear el modelo, la migración, y semilleros fijos. Ejecutamos los comandos:

php artisan make:model Tema -m

php artisan make:model Roll -m

php artisan make:seeder TemasTableSeeder

php artisan make:seeder RollsTableSeeder

php artisan make:seeder UsersTableSeeder

Para el modelo 'App\Models\Tema.php', agregamos el código:

protected $fillable = [ 'nombretema', ];

Y en la migración 'Database\Migrations\2020_10_24_030311_create_temas_table.php', entre el id y el timestamp: 

$table->string('nombretema');

En el semillero 'Database\Seeders\TemasTableSeeder.php', agregamos:

use App\Models\Tema;

Y en el run:

        Tema::create(["nombretema" => "HTML"]);

        Tema::create(["nombretema" => "Css"]);

        Tema::create(["nombretema" => "PHP"]);

        Tema::create(["nombretema" => "Javascript"]);

        Tema::create(["nombretema" => "Laravel"]);

Para el modelo 'App\Models\Roll.php', agregamos el código:

protected $fillable = ['roll_id', 'roll_name',];

Y en la migración 'Database\Migrations\2020_10_24_030329_create_rolls_table.php', entre el id y el timestamp: 

$table->unsignedBigInteger('roll_id');

$table->string('roll_name');

En el semillero 'Database\Seeders\RoolsTableSeeder.php', agregamos:

use App\Models\Roll;

Y en el run:

        Roll::create(["roll_id" => 1, "roll_name" => "Estudiante"]);

        Roll::create(["roll_id" => 2, "roll_name" => "Editor"]);

        Roll::create(["roll_id" => 3, "roll_name" => "Administrador de Roles"]);

        Roll::create(["roll_id" => 4, "roll_name" => "Administrador de proyectos"]);

        Roll::create(["roll_id" => 5, "roll_name" => "Superusuario"]);

Para el semillero fijo de usuarios 'Database\Seeders\UsersTableSeeder.php', agregamos:

use App\Models\User;

Y en el run:

User::create(["name" => "Luis Gabriel", "email" => "luisga@email.com", "password" => '$2y$10$z8am7QpsiOP7Fd1rNHdgLOryA6JYshcppMtiFOxZ96WvVNgDNtV2q']);
User::create(["name" => "LuisN", "email" => "email@email.com", "password" => "$2y$10$z8am7QpsiOP7Fd1rNHdgLOryA6JYshcppMtiFOxZ96WvVNgDNtV2q"]);
User::create(["name" => "LuisN2", "email" => "email2@email.com", "password" => "$2y$10$z8am7QpsiOP7Fd1rNHdgLOryA6JYshcppMtiFOxZ96WvVNgDNtV2q"]);

El password viene codificado, por lo cual es necesario crear un usuario con una contraseña para copiar el password codificado de la base de datos, para el ejemplo el password es '12341234'.

Creando semillero aleatorio para Post

Un Factory permite agregar datos sin un semillero, vamos al archivo 'Database\Factories\PostFactory.php'

El cual como se explicó en el artículo anterior se creó al usar el comando:

php artisan make:model Post -mf

En caso de no haberlo creado inicialmente usar el comando:

php artisan make:factory Post

Agregamos al archivo 'Database\Factories\PostFactory.php'

use App\Models\User;

Y dentro de la función definition agregamos:

$count = User::count();

Y en el array return agregamos:

            'user_id' => $this->faker->numberBetween(1, $count),

            'title' => $this->faker->text($maxNbChars = 100),

            'content' => $this->faker->text($maxNbChars = 1000),

Registrando los semilleros fijos, y aleatorios

Y creando función para limpiar tablas.

Vamos al archivo 'Database\Seeders\DatabaseSeeder' y agregamos:

use Illuminate\Support\Facades\DB;

Y para el factory de Post:

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

Creamos después de la función run: 

public function truncateTables(array $tables){
    DB::statement('SET FOREIGN_KEY_CHECKS = 0;');
        foreach ($tables as $table){
         DB::table($table)->truncate();
        }
      DB::statement('SET FOREIGN_KEY_CHECKS = 1;');
  }

Y en la función run agregamos los semilleros que queremos alimentar:

        $this->truncateTables(['temas']);
        $this->call(TemasTableSeeder::class);
        $this->truncateTables(['temas']);
        $this->call(TemasTableSeeder::class);
        $this->truncateTables(['rolls']);
        $this->call(RollsTableSeeder::class);
        $this->truncateTables(['posts']);
        Post::factory()->times(50)->create();

Vemos como Post utiliza el factory para la creación del semillero, sin necesidad de un Seed.

Por último eliminamos las tablas de la base de datos, y ejecutamos la migración (comando encargado de crear las tablas) y la alimentación de las tablas con los semilleros con los siguientes comandos.

php artisan migrate

php artisan db:seed

Observaciones:

  • Al alimentar la tabla de usuarios de esta forma, al ingresar nos muestra la vista home, sin embargo al ir a las demás opciones, pide la verificación del correo, lo cual ha sido previsto, con un enlace que envía el correo.
  • Si queremos que home también requiera de verificación, debemos ir al archivo 'web.php', y colocar la ruta home, dentro del grupo que exige dicha verificación, y cuyo código es 'Route::group(['middleware' => 'verified'], function(){}'.
En el siguiente artículo agregaremos temas y autor a los posts.

Comentarios