styde-seeder-laravel-5-1

Styde Seeder es un componente desarrollado por Duilio para mejorar el proceso de creación de datos de prueba en nuestros proyectos de Laravel. Este paquete nos proporciona un conjunto de métodos que nos permiten trabajar con esto de una manera sencilla. En este tutorial veremos cómo trabajar con él.

Instalación

Este componente se encuentra disponible a través de Composer, por tanto, puedes instalarlo ejecutando por consola:

composer require styde/seeder

o agregando manualmente al archivo composer.json en la sección require :

"styde/seeder": "^1.0"

y luego ejecutando composer update 

Al terminar la instalación, vamos al archivo app.php del directorio config del proyecto para agregar el service provider del paquete en el array providers :

'providers' => [
   // ...
   Styde\Seeder\SeederServiceProvider::class,
   // ...
],

Por último, ir a el archivo DatabaseSeeder.php ubicado en el directorio database/seeds/ para sustituir lo que contiene por lo siguiente:

<?php

use Styde\Seeder\BaseSeeder;

class DatabaseSeeder extends BaseSeeder
{
    protected $truncate = array(
        //'users',
    );

    protected $seeders = array(
        //'User',
    );
}

En este archivo hay dos arrays: $truncate  y $seeders.  En el primero ($truncate) se deben agregar los nombres de las tablas de la base de datos que se desean llenar con los datos de prueba para que el paquete las vacíe antes de llenarlas. En el segundo array ($seeders) se deben añadir los nombres de las clases de los seeders omitiendo el sufijo TableSeeder  pues el paquete lo agregará automáticamente.

Uso

Para crear un nuevo seeder ejecutamos por consola:  

php artisan styde:seeder Nombre

En Nombre  colocamos el nombre del seeder al cual le queremos generar datos de prueba. Por ejemplo, para el modelo User:

php artisan styde:seeder User

Esto creará un archivo llamado UserTableSeeder.php en el directorio database/seeds.

Ahora vamos a agregar una nueva instancia de nuestro modelo User en getModel() y además agregar los atributos del modelo en el método getDummyData(), usando Faker para generar valores de forma aleatoria. Por lo que el archivo nos quedará así:

<?php

use App\User;
use Faker\Generator;
use Styde\Seeder\Seeder;

class UserTableSeeder extends Seeder
{
    protected $total = 50;

    public function getModel()
    {
        return new User();
    }

    public function getDummyData(Generator $faker, array $custom = [])
    {
        return [
            'name' => $faker->name,
            'email' => $faker->email,
            'password'  => bcrypt('secret'),
        ];
    }
}

Puedes ver más sobre Faker en la Seeders y el componente Faker en Laravel 5

Tan solo nos queda agregar los nombres de nuestro seeder (User , sin el sufijo TableSeeder) y la tabla de base de datos (users) en el archivo DatabaseSeeder.php así:

    protected $truncate = array(
        'users',
    );
    protected $seeders = array(
        'User',
    );

Luego, no sin antes comprobar que tenemos las credenciales de la base de datos de nuestro proyecto en el archivo .env, ejecutamos por terminal:

php artisan db:seed

En caso de obtener un error como “Class UserTableSeeder does not exist” ejecutamos por consola composer dump-autoload 

y al revisar nuestra base de datos podemos comprobar que los datos de prueba para el modelo User fueron generados exitosamente:

datos-prueba-users

Por defecto se generaran 50 registros, pero, si se quiere una cantidad en específico o con valores específicos para los atributos se puede añadir el método run a la clase del seeder y usar algunos de los métodos que nos proporciona el paquete:

  • make() : para crear un nuevo registro del modelo dado. Puede recibe como argumento un array con valores específicos para los atributos.
  • create() : para crear crear un nuevo registro del modelo dado y a su vez persistirlo en la base de datos. También puede recibir el array de atributos específicos.
  • makeMultiple() : para crear una cantidad específica de registros de un modelo y como los anteriores puede recibir el array de atributos específicos.
  • createMultiple() : para crear y persistir una cantidad específica de registros del modelo, además puede pasarse los atributos específicos.

Por ejemplo, si quisieramos crear un usuario con valores específicos y a su vez 5 usuarios pero con password=»1234″ añadiríamos al archivo UserTableSeeder.php lo siguiente:

public function run()
{
    $this->create([
        'name' => 'Pedro Perez',
        'email' => '[email protected]',
        'password' => bcrypt('contraseña'),
    ]);

    $this->createMultiple(5, ['password'  => bcrypt('1234')]);
}

Como resultado de ejecutar php artisan db:seed  por consola vemos en la base de datos:

datos-prueba-especificos-users

Además, si necesitamos trabajar con modelos relacionados, Styde Seeder nos ofrece esta opción por medio del método random(), que nos permite asignar las relaciones de forma aleatoria bien sea que existan o no registros en la tabla o modelo relacionada, y si no existen, Styde Seeder los crea por nosotros. Veamos el siguiente ejemplo:

  1. Vamos a crear un modelo Post con su respectiva migración, que este relacionado con el modelo User, es decir, que un user puede ser autor de varios posts:
    php artisan make:model Post -m
  2. Ubicamos el archivo archivo de la migración creado (/database/migrations/create_posts_table.php)  y agregamos algunos atributos:
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('content');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
            $table->timestamps();
        });
    }
  3. Creamos un nuevo seeder para Post ejecutando:
    php artisan styde:seeder Post

    Lo agregamos junto con la tabla posts al archivo DatabaseSeeder.php así:

    protected $truncate = array(
       'users',
       'posts',
    );
    protected $seeders = array(
       'User',
       'Post',
    );
  4. y modificamos el archivo  PostTableSeeder.php ubicado en database/seeds de esta manera:
    <?php
    
    use App\Post;
    use Faker\Generator;
    use Styde\Seeder\Seeder;
    
    class PostTableSeeder extends Seeder
    {
        protected $total = 50;
    
        public function getModel()
        {
            return new Post();
        }
    
        public function getDummyData(Generator $faker, array $custom = [])
        {
            return [
                'title'   => $faker->sentence,
                'content' => $faker->paragraph,
                'user_id' => $this->random('User')->id
            ];
        }
    }

    El método random() obtiene un objeto aleatorio ya registrado previamente o crea uno si no se han registrado aún.

  5. Ejecutamos la migración con php artisan migrate:refresh –seed  y obtenemos en la base de datos 50 posts aleatorios y cada uno de dichos posts tendrá uno de los 6 usuarios creados previamente, asignado como autor.

Bien, esperamos que les sea de utilidad este paquete que está disponible en GitHub. Para cualquier duda o comentario puedes dejarlos en la sección de abajo y no olvides compartir en redes sociales.

Material relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior PHP companion para Sublime Text 3 Lección siguiente Cómo subir y descargar archivos por FTP en Laravel