<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paula Araujo </title>
    <description>The latest articles on DEV Community by Paula Araujo  (@pilsaraujo).</description>
    <link>https://dev.to/pilsaraujo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2563326%2Ffd5eddf3-fe20-4487-b4c0-9baa0290bb9c.jpeg</url>
      <title>DEV Community: Paula Araujo </title>
      <link>https://dev.to/pilsaraujo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pilsaraujo"/>
    <language>en</language>
    <item>
      <title>Factories e Seeders com Laravel</title>
      <dc:creator>Paula Araujo </dc:creator>
      <pubDate>Thu, 14 Aug 2025 20:24:34 +0000</pubDate>
      <link>https://dev.to/pilsaraujo/factories-e-seeders-com-laravel-l8</link>
      <guid>https://dev.to/pilsaraujo/factories-e-seeders-com-laravel-l8</guid>
      <description>&lt;p&gt;Seeders e Factories são ferramentas poderosas no Laravel que ajudam a popular o banco de dados com dados de teste ou iniciais.&lt;/p&gt;

&lt;p&gt;Esse será o primeiro artigo de uma série visando ajudar a comunidade Laravel a aprender melhores conceitos sobre a ferramenta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pré-requisitos&lt;/strong&gt;: Laravel 12, PHP 8.3, Composer instalado e familiaridade básica com Eloquent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prólogo&lt;/li&gt;
&lt;li&gt;O que são Seeders e Factories?&lt;/li&gt;
&lt;li&gt;Por que usar Seeders e Factories?&lt;/li&gt;
&lt;li&gt;
Criando e Utilizando Factories

&lt;ul&gt;
&lt;li&gt;Criando uma Factory&lt;/li&gt;
&lt;li&gt;Criando 'states' dentro de uma Factory&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Criando e Utilizando Seeders

&lt;ul&gt;
&lt;li&gt;Criando um Seeder&lt;/li&gt;
&lt;li&gt;Executando Seeders&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Relacionamentos com Factories&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Prólogo
&lt;/h2&gt;

&lt;p&gt;Até não muito tempo atrás, na hora de &lt;strong&gt;popular um banco de dados&lt;/strong&gt;, eu tinha o costume de utilizar &lt;strong&gt;funções do próprio Eloquent&lt;/strong&gt;, escrevendo na mão os &lt;code&gt;User::create([...])&lt;/code&gt; da vida e passando os dados que queria. Quando chega em certo ponto do crescimento do projeto, isso se torna &lt;strong&gt;repetitivo e difícil de manter&lt;/strong&gt;, fora a &lt;strong&gt;dificuldade de simular cenários&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isso aconteceu até eu descobrir os queridos chamados &lt;code&gt;Seeders&lt;/code&gt; e &lt;code&gt;Factories&lt;/code&gt;do Laravel, que foram os responsáveis por tornar essa tarefa muito mais agradável e fácil de manter e executar.&lt;/p&gt;

&lt;p&gt;Se assim como a eu do passado você luta para mockar dados, podemos mudar isso!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neste artigo&lt;/strong&gt;, você vai aprender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que são Seeders e Factories&lt;/li&gt;
&lt;li&gt;Como criar e configurar&lt;/li&gt;
&lt;li&gt;Boas práticas para cenários reais&lt;/li&gt;
&lt;li&gt;Uso avançado com relacionamentos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. O que são Seeders e Factories?
&lt;/h2&gt;

&lt;p&gt;As &lt;code&gt;Factories&lt;/code&gt; são as responsáveis por gerar os dados falsos de maneira automatizada, enquanto os &lt;code&gt;Seeders&lt;/code&gt; serão os responsáveis por "ativar" essas Factories e inserir os dados desejados no banco.&lt;/p&gt;

&lt;p&gt;Então, os objetos prontos criados pelas Factories são perfeitos para cenários de testes.&lt;/p&gt;

&lt;p&gt;Por exemplo: em uma &lt;code&gt;UserFactory&lt;/code&gt; nós definimos para que ela gere usuários que possuem nome, e-mail, documento e senha de forma completamente aleatória. E pode ser criado em massa!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Model vs Factory&lt;/strong&gt; : um espelho. &lt;strong&gt;Models&lt;/strong&gt; precisam dos "fillables" para preencher os campos no banco de dados, enquanto &lt;strong&gt;Factories&lt;/strong&gt; usam esses campos para gerar dados falsos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com essa definição, na chamada do Seeder ele irá "ativar" as Factories desejadas e popular o banco de dados.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Factory&lt;/strong&gt;: classe que define atributos falsos (fake data) por meio da biblioteca Faker. &lt;strong&gt;Seeder&lt;/strong&gt;: classe que orquestra a execução de Factories e insere dados no banco.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Por que usar Seeders e Factories?
&lt;/h2&gt;

&lt;p&gt;Se a explicação sobre o que são ainda não o convenceu, posso citar alguns motivos para utilizá-los:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A criação de dados para teste é muito mais rápida;&lt;/li&gt;
&lt;li&gt;A simulação é realista, podendo representar cenários complexos, pois considera o relacionamento entre os modelos e pode gerar dados em grande volume;&lt;/li&gt;
&lt;li&gt;São fáceis de manter, reproduzir e adicionar informações.&lt;/li&gt;
&lt;li&gt;Diminuem muito o risco de erros na inserção de dados manuais.&lt;/li&gt;
&lt;li&gt;Aumentam a confiabilidade na hora de partir para cenários mais complexos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com tudo isso, podemos gerar cenários consistentes em nosso projeto e tornar nosso ambiente mais previsível em relação à modelagem feita. Na hora de &lt;strong&gt;fazer os testes&lt;/strong&gt;, essas coisas são &lt;strong&gt;muito valiosas&lt;/strong&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Criando e utilizando Factories
&lt;/h2&gt;

&lt;p&gt;Pra gente começar, vamos lembrar que o Laravel tem uma ferramenta maravilhosa para criação de qualquer coisa: o Artisan.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Criando uma Factory
&lt;/h3&gt;

&lt;p&gt;Primeiro vamos criar uma nova &lt;code&gt;Factory&lt;/code&gt; no nosso projeto. Com o artisan você consegue fazer isso de um jeito bem simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:factory &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;span class="c"&gt;# Description:&lt;/span&gt;
&lt;span class="c"&gt;#  Create a new model factory&lt;/span&gt;

&lt;span class="c"&gt;# Usage:&lt;/span&gt;
&lt;span class="c"&gt;#  make:factory [options] [--] &amp;lt;name&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# Arguments:&lt;/span&gt;
&lt;span class="c"&gt;#  name                  The name of the factory&lt;/span&gt;

&lt;span class="c"&gt;# Options:&lt;/span&gt;
&lt;span class="c"&gt;#  -m, --model[=MODEL]   The name of the model&lt;/span&gt;


php artisan make:factory UserFactory &lt;span class="nt"&gt;--model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando irá gerar uma classe &lt;code&gt;database/factories/UserFactory.php&lt;/code&gt;, tendo como base a model User, com a seguinte estrutura considerando uma model User padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Models\User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\Factories\Factory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserFactory&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;safeEmail&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'email_verified_at'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'role'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;randomElement&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; 
            &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;code&gt;definition()&lt;/code&gt; é onde serão definidos os atributos e os valores que deverão ser gerados. Já no valor do atributo, podemos ver o &lt;code&gt;Faker&lt;/code&gt;, que é uma biblioteca do &lt;strong&gt;Laravel&lt;/strong&gt; e vai ser o seu maior aliado na hora de gerar dados falsos de forma rápida.&lt;/p&gt;

&lt;p&gt;Dentro dele existem métodos para escolher o tipo de dado que precisa gerar, no exemplo acima ele gera um nome e um e-mail seguro aleatórios. Mas ele pode gerar outros tipos de dados também, como datas, textos, um número dentro de um intervalo desejado e até mesmo CPF!&lt;/p&gt;

&lt;p&gt;Esse último eu descobri recentemente. Para ter acesso a ele e outras coisas como RG e CNPJ, basta mudar o valor do &lt;code&gt;APP_FAKER_LOCALE&lt;/code&gt; no seu .env para pt_BR e prontinho!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_FAKER_LOCALE="pt_BR" 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Certifique-se de atualizar o .env.example com o novo &lt;code&gt;APP_FAKER_LOCALE&lt;/code&gt; para não dar erro em uma nova instalação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora você pode gerar &lt;strong&gt;documentos brasileiros aleatórios&lt;/strong&gt; também.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Criando 'states' dentro de uma factory
&lt;/h3&gt;

&lt;p&gt;Os &lt;strong&gt;"States"&lt;/strong&gt; são métodos de manipulação que podem ser inseridos na &lt;strong&gt;"Factory"&lt;/strong&gt; caso a &lt;strong&gt;"Model"&lt;/strong&gt; tenha diferentes estados para algum atributo, como, por exemplo, um usuário que pode ser "admin" ou usuário comum, com e-mail verificado ou não.&lt;/p&gt;

&lt;p&gt;Para a construção desses estados, a estrutura será a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserFactory&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;isAdmin&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;static&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  
            &lt;span class="s1"&gt;'role'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
        &lt;span class="p"&gt;]);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;regularUser&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;static&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  
            &lt;span class="s1"&gt;'role'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
        &lt;span class="p"&gt;]);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;unverified&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;static&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;  
            &lt;span class="s1"&gt;'email_verified_at'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
        &lt;span class="p"&gt;]);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criados os states, podemos utilizá-los da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isAdmin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;regularUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unverified&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste bloco de código, criamos dois usuários. O primeiro será definido como "admin" e o segundo, como usuário comum. No segundo, utilizei o estado que define o e-mail como não verificado.&lt;/p&gt;

&lt;p&gt;A utilização de estados é muito útil para a realização de testes controlados, pois permite simular cenários específicos e traduzir regras de negócio. Por exemplo, podemos gerar um usuário "admin" para conferir se as permissões e os acessos estão corretos para esse nível.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Criando e Utilizando Seeders
&lt;/h2&gt;

&lt;p&gt;Agora que sabemos criar Factories, vamos para os Seeders. Assim como nas Factories, podemos contar com o apoio do Artisan.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Criando um Seeder
&lt;/h3&gt;

&lt;p&gt;Comando básico no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:seeder &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;span class="c"&gt;#Description:&lt;/span&gt;
&lt;span class="c"&gt;#  Create a new seeder class&lt;/span&gt;

&lt;span class="c"&gt;#Usage:&lt;/span&gt;
&lt;span class="c"&gt;#  make:seeder &amp;lt;name&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;#Arguments:&lt;/span&gt;
&lt;span class="c"&gt;#  name                  The name of the seeder&lt;/span&gt;

php artisan make:seeder UserSeeder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando irá gerar uma classe &lt;code&gt;database/seeders/UserSeeder.php&lt;/code&gt; com a seguinte estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Database\Seeders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Console\Seeds\WithoutModelEvents&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Seeder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserSeeder&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Seeder&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;    
     &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="c1"&gt;//  &lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;code&gt;run()&lt;/code&gt; é o que será executado e onde iremos definir o que queremos que seja inserido no banco de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Executando Seeders
&lt;/h3&gt;

&lt;p&gt;Para rodar um seeder específico, o comando no terminal deverá ser utilizado dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan db:seed &lt;span class="nt"&gt;--class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UserSeeder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas podemos também rodar todos os Seeders a partir do &lt;code&gt;DatabaseSeeder.php&lt;/code&gt; que já vem por padrão em um projeto Laravel. Para isso, basta estruturar método &lt;code&gt;run()&lt;/code&gt; do &lt;code&gt;DatabaseSeeder.php&lt;/code&gt; da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserSeeder&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Seeder&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="nc"&gt;UserSeeder&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É possível também optar por não criar Seeders separados e construir direto no &lt;code&gt;DatabaseSeeder.php&lt;/code&gt; quais dados deseja inserir utilizando as Factories. Ficando dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserSeeder&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Seeder&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isAdmin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;regularUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unverified&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após decidir qual abordagem faz mais sentido para o seu projeto, sem especificar um Seeder, execute o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan db:seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem uma especificação de Seeder no comando, o DatabaseSeeder é o que será executado, com o que foi colocado dentro do método &lt;code&gt;run()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para ajudar com testes, é legal também utilizar um Seeder específico para visualizar um ambiente controlado e que mostre todas as informações básicas do projeto, como um EssentialSeeder.&lt;/p&gt;

&lt;p&gt;Utilizando de exemplo um projeto em que estou trabalhando atualmente (que será incluído nas referências desse artigo), para me ajudar a visualizar as informações dele em sua totalidade posso criar um EssentialSeeder que crie um usuário que pertence a um empresa e que essa empresa possua um número de vouchers ativos e vouchers utilizados.&lt;/p&gt;

&lt;p&gt;Quando for executado apenas este Seeder, poderei ter uma previsão de como serão as telas em um caso real.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Relacionamentos com Factories
&lt;/h2&gt;

&lt;p&gt;Em aplicações reais as Models têm relações entre si. Um usuário que possui um perfil, um pedido de compra que possui muitos items por exemplo.&lt;/p&gt;

&lt;p&gt;Para criar um usuário que possua um perfil com seus detalhes ligados a ele, iremos utilizar o método &lt;code&gt;has()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Profile&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unverified&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que também podemos combinar com states criados anteriormente.&lt;/p&gt;

&lt;p&gt;Agora, se já temos um user criado previamente e queremos vincular um perfil a ele, utilizamos o &lt;code&gt;for()&lt;/code&gt; ao invés do &lt;code&gt;has()&lt;/code&gt;. Desta forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;Profile&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Associa ao usuário criado acima&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Conclusão
&lt;/h2&gt;

&lt;p&gt;Com Seeders e Factories é possível popular seu banco de dados de forma consistente, gerar modelos em poucos segundos evitando repetição de código e conseguindo nesse processo uma forma fácil e rápida de testar qualquer cenário específico que deseja. Tudo isso com um código fácil de dar manutenção posteriormente!&lt;/p&gt;

&lt;p&gt;Um ponto importante também é que é a primeira vez que escrevo um artigo técnico na vida. Fiz tudo isso aqui pra te convencer que vale muito a pena começar a utilizar Seeders e Factories no seu projeto. ;)&lt;/p&gt;

&lt;p&gt;Quero deixar também um agradecimento aos revisores do artigo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Clintonrocha98" rel="noopener noreferrer"&gt;Clinton Rocha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danielhe4rt" rel="noopener noreferrer"&gt;Daniel Reis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/RichardGL11" rel="noopener noreferrer"&gt;Richard&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  8. Referências
&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://laravel.com/docs/12.x/seeding#writing-seeders" rel="noopener noreferrer"&gt;Writings Seeders&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://laravel.com/docs/12.x/database-testing#model-factories" rel="noopener noreferrer"&gt;Model Factories&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/3pontos-tech/gil-benefits" rel="noopener noreferrer"&gt;Gil Benefits&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atualmente trabalho em uma empresa de consultoria financeira que tem serviços personalizados voltados a desenvolvedores! Você consegue saber mais aqui: &lt;br&gt;
&lt;a href="https://firece.com.br/code-capital" rel="noopener noreferrer"&gt;Fire|ce - Code Capital&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
