You are currently viewing Como usar seeders no Laravel
seeders

Como usar seeders no Laravel

Introdução

Os seeders no Laravel, serve para poder inserir diretamente dados no banco através de uma classe.

Com isso, antes de executar as migrations, é possível colocar dados padrão no banco, para garantir que quando for rodar alguma migration que dependa de alguma informação, esse dado já exista.

Pense em duas situações onde pode ser útil o seeder.

Quando um novo banco de dados é criado, e você tem uma tabela de usuários, você precisará registrar um usuário novo, porém é possível indicar que sempre que eu criar um novo banco, ou rodar um fresh, já crie um usuário automaticamente.

Outro exemplo seria, imagine que tenho a tabela “estados” na aplicação, onde preciso popular com os dados dos estados brasileiros, não preciso fazer isso pela tela, posso criar um seeder para criar automaticamente.

Então pense que, sempre que tiver dados que são padrão no seu sistema, você precise propagar esses dados para o banco logo na criação, faça com seeder.

Como criar seeder

Para criar um novo seeder, é possível fazer utilizando o seguinte comando do Laravel:

php artisan make:seeder UserSeeder

Por padrão, será criado um novo arquivo dentro do diretório database/seeders/.

Nesse arquivo criado será uma classe com o nome UserSeeder, e dentro dela terá o método run, dentro dele será possível colocar os dados desejados para inserir no banco.

Como executar seeder

Para executar o seeder para propagar os dados para o banco, também é possível fazer a partir de comandos do Laravel.

O comando padrão é:

php artisan db:seed

Esse comando irá invocar a classe Database\Seeders\DatabaseSeeder, que é a classe base dos seeders, nele você pode definir quais seeders e qual a ordem de execução.

Caso queira, é possível executar somente um seed, e não precisa declarar ele no DatabaseSeeder, no comando acima, da para passar uma flag para indicar a classe de seed que será executada:

php artisan db:seed --class=UserSeeder

Mesmo que tenha mais seeders, da próxima, somente esse será executado.

E por fim, também é possível executar um seed no momento de dar um fresh no banco.

O fresh é utilizado para apagar todas as tabelas e criar novamente, e nesse momento já é possível propagar os dados do banco:

php artisan migrate:fresh --seed

Como escrever a partir de factory

Dependendo da quantidade de informações e de como você quer incluir esses dados no banco, pode ser trabalhoso criar tudo manualmente.

Para isso, é possível ter o auxilio das factories, para “fabricar” mais informações a serem inseridas.

Por exemplo, é conveniente ter um banco de dados com um certo volume de informações para testes no ambiente local, então para isso, vamos criar esses dados com os seeders utilizando a factory.

Para o exemplo, irei criar diversos usuários, caso você esteja utilizando a última instalação do Laravel, provavelmente você já terá a model e a factory de User, caso não tenha, veja aqui.

Depois de criar o seeder como acima, colocar o seguinte código:

use App\Models\User;
 
/**
 * Run the database seeders.
 *
 * @return void
 */
public function run()
{
    User::factory()
            ->count(20)
            ->create();
}

Com isso, serão criados 20 usuários diretamente na hora que o seeder for executado.

Você pode fazer este mesmo processo com qualquer informação do seu sistema.

Ordenar execução dos seeders

Se você tiver diversos seeders, é uma boa prática definir a ordem de execução dos mesmos.

Isso porque, pode ter um seeder no qual o dado depende de uma informação de outro seeder.

E nesse caso, se for executado antes de ter o dado dependente, ou seja, fora de ordem, irá dar erro na execução.

Para isso, no arquivo Database\Seeders\DatabaseSeeder, é possível definir essa ordem dentro do método run.

Dentro dele é possível chamar o método call, que é um array, e dentro desse array é só passar a classe correspondente de cada seeder:

/**
 * Run the database seeders.
 *
 * @return void
 */
public function run()
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

Dessa forma, os seeders sempre serão executados nessa ordem.

Conclusão

Este recurso é muito interessante, ele ajuda demais a propagar dados no banco, seja dados fictícios para ambiente de desenvolvimento, ou então dados reais.

Além disso, pode ajudar a manter a consistência entre dados padrão do sistema, principalmente quando se trabalha em equipe.

Com certeza é uma função muito útil trazida pelo Laravel.

Para ver outros canais onde o posto conteúdo veja os Links do Programando Soluções.

Referências

https://laravel.com/docs/9.x/seeding

https://blog.especializati.com.br/seeders-no-laravel/

https://riptutorial.com/laravel/example/17358/creating-a-seeder

https://laravel.com/docs/9.x/eloquent-factories

Este conteúdo te ajudou de alguma forma?