O que são e para que serve Seeders no Laravel

Seeders é um poderoso mecanismo que nos ajudam a popular dados em um banco de dados.

PHP Moderno: Criando uma aplicação com área administrativa

Durante o desenvolvimento de qualquer aplicação nós desenvolvedores nos deparamos com um cenário na qual precisamos testar nossos módulos, para isso utilizamos as artimanhas dos Test Doubles, por exemplo. Independente do que vamos utilizar para os testes, ficar definindo manualmente todas as informações é chato e demorado, sem falar que podemos nos esquecer de algo e algum teste não ser bem sucedido.

No Laravel temos um poderoso mecanismo que vamos estudar hoje, que são os Seeders. Com ele é possível gerar informações para as nossas colunas do banco de dados de forma automática e aleatória. 

Criando uma nova tabela

Antes de mais nada, vale lembrar que para usar o Seed, é necessário ter uma tabela criada. Para o nosso exemplo, vamos utilizar uma tabela chamada de Newsletters, na qual criamos com o comando abaixo. Se você já tem a sua tabela, ignore os passos de criação. 

php artisan make:migration create_newsletters_table

O arquivo será criado em database\migrations. Vamos definir sua estrutura como a seguinte:

    public function up()
    {
        Schema::create('newsletters', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email');
            $table->timestamps();
        });
    }

Agora só rodar o comando responsável por criar as tabelas.

php artisan migrate

Se por algum motivo você precise recriar todas as suas tabelas, usamos o comando de fresh.

php artisan migrate:fresh

Criando os Seeders

Com a nossa tabela em mãos, vamos criar um arquivo de Seeder, ele é responsável conter os códigos com as instruções para cada coluna na qual desejamos popular. Podemos criar um novo Seed usando o comando abaixo, mas atente-se a convenção, devemos deixar o nome do nosso arquivo na maiúscula seguido de Seed, ex: NewsletterSeeder. Também devemos definir os nomes no singular.

php artisan make:seeder NewsletterSeeder

Abrindo o nosso arquivo database\seeders\NewsletterSeeder.php, temos a nossa disposição o método up(), é nele que vamos atuar. Vamos utilizar a classe DB para inserir um novo registro na tabela de newsletters.

Já para inserir valores aleatórios nas colunas, utilizaremos a classe Str, chamando alguns métodos e passando os parâmetros desejados.

Observe nosso código completo abaixo.

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class NewsletterSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('newsletters')->insert([
            'name'  => Str::random(10),
            'email' => Str::random(10) . '@gmail.com',
        ]);
    }
}

No método insert, definimos um array associativo, passando como chave o nome da tabela e como valor a resposta do método random. Para o campo name, vamos ter uma string aleatória de 10 caracteres.

Você pode ver todos os métodos estáticos da classe Str em https://laravel.com/api/8.x/Illuminate/Support/Str.html.

Vamos agora fazer com que nossa Seeder seja executada, para isso rodamos o comando abaixo

php artisan db:seed --class =NewsletterSeeder

Observe que tivemos que especificar o nome da nossa Seeder, esse processo se torna chato e inviável a partir do momento em que temos dois ou mais itens. Vamos concordar também, que o comando acima é muito verboso.

Vamos agora fazer um pequeno ajuste no arquivo database\seeders\DatabaseSeeder.php, conforme mostra o código abaixo.

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
      $this->call([
          NewsletterSeeder::class
      ]);
    }
}

Note que dentro do método run() estamos passando um array no $this->call, informando a nossa classe Seeder criada anteriormente. Observe também que estamos atribuindo o use logo no começo do nosso arquivo. 

Insira nesse array todas as suas classes de Seeders, pois agora é só rodar o comando abaixo que todas elas serão executadas automaticamente.

php artisan db:seed

Na imagem acima podemos ver dois registros gerados a partir das Seeders.

Finalizamos nosso artigo por aqui, espero que tenha entendido a importância e como utilizar as Seeders para automatizar alguns processos. Não deixe de conferir a documentação oficial para ver mais alguns exemplo, como gerar uma senha a partir do método hash.

Nos vemos em breve.

Referências

Seeding: https://laravel.com/docs/8.x/seeding