Populando sua Base de Dados com Factory

Aprenda a inserir múltiplos registros devidamente parametrizados em seu Banco de Dados usando o Laravel.

Gabriel Albuquerque (Albuca)
6 min readAug 10, 2020
Imagem de fundo por Pixabay no banco de imagens Pexels: https://www.pexels.com/@pixabay

Mas o que é Factory?

O Factory é usado no momento de desenvolvimento/teste de software. Sabe quando você está programando sua aplicação e precisa ver como ele se comporta com múltiplos registros? Geralmente nesse momento nós inserimos os registros “na mão”.

Ok, desse modo é chato, mas a maior parte das vezes resolve o problema, só vamos copiar e colar a mesma linha de insert no MySQL, o que complica é quando temos campos de tipo “unique” como e-mails, slugs, nicknames, nesse caso o copiar e colar não vai funcionar, pois as informações não podem se repetir, e pior ainda, quando queremos testar uma paginação de 50, 100, 200 resultados, vai ficar complicado de inserir tudo na mão.

O Factory tem especificamente essa função, ele vai permitir o programador inserir múltiplos registros “aleatórios” dentro do Banco de Dados, se você quiser 50 registros, 100 ou 1000, será só especificar a quantidade.

Aleatórios?

Você deve ter notado as aspas no ‘aleatórios’, fiz isso pois esses registros não serão completamente aleatórios, o Factory no Laravel nos permite setar um ‘escopo’ para o tipo de dado a inserir em determinado tipo de campo, de forma que podemos ter nomes aleatórios para campos de nomes, e-mails aleatórios e únicos para campos de email, ou seja, apesar de randômicos, os registros seguirão um certo escopo para que não sejam inseridos dados inválidos (como um e-mail em um campo de endereço, por exemplo).

Inserindo os registros

Bom, para exemplificar o uso do Factory, vamos simular a população de uma tabela de usuários, você já deve ter um Schema criado no DB, um Model de usuários e uma migration para a tabela de Users com os campos de ‘id’, ‘name’, ‘email’, ‘address’, ‘password’ e ‘rememberToken’, se você não sabe usar migrations, dê uma lida nesse artigo meu falando um pouco a respeito.

Mas voltando ao Factory, em um console aberto na raíz do projeto, digite o seguinte (ignore os comentários):

php artisan make:factory UserFactory --model=User# php artisan: Execução do artisan com o intepretador PHP
# make:factory: Crie uma factory
# UserFactory: Nome da factory <Tabela>Factory
# --model: Especificação do Model a ser usado

Provavelmente, pode aparecer um erro como ‘Factory already exists!’, significa que você já tem uma factory com o mesmo nome na sua aplicação, não se preocupe, em algumas versões do Laravel ele cria uma Factory para User automaticamente ao criar o projeto, basta apagar o arquivo UserFactory.php de dentro de database/factories, não vamos usar uma Factory pronta, pois precisamos saber como criar e configurar uma.

Estrutura

database/factories/UserFactory.php

A estrutura é confusa a primeira vista, vou tentar deixar o mais claro o possível.

O comando digitado no console irá criar um arquivo em database/factories com o nome especificado, no arquivo você encontrará (entre outras coisas) a execução do método ‘define’ da variável $factory.

$factory->define()

O método define recebe como primeiro parâmetro a classe do modelo da tabela a ser criada (se você não usou a flag — model terá que setar a classe manualmente), o segundo parâmetro é uma função anônima que recebe como parâmetro uma variável do tipo Faker.

$factory->define(User::class, function (Faker $faker) {})

Essa função anônima retorna um array associativo com os campos a preencher e o tipo de preenchimento (se é nome, e-mail, algum número aleatório ou algo do tipo).

$factory->define(User::class, function (Faker $faker) {    return [        'campo' => tipodocampo   

];
})

Para entender melhor como que é definido esse tipo de preenchimento, precisamos falar sobre o Faker.

Faker

Página no Github do Faker https://github.com/fzaninotto/Faker.

Como eu disse, o segundo parâmetro de define é uma função anônima que recebe um parâmetro Faker, mas o que é esse Faker?

O Faker é um projeto independente do PHP (não faz parte do Laravel), ele vai ser essencial na criação da Factory, sendo responsável por ‘escopar’ o tipo de dado a ser preenchido, como eu disse anteriormente que as factories fazem.

Os tipos são especificados pelos método da variável $faker, por exemplo ele tem um método para endereços randômicos, como também tem para nomes, parágrafos e muitos (mas muito) outros, como meu objetivo é explicar o funcionamento do Factory, só iremos usar alguns métodos do Faker, por conta disso vou deixar a documentação do Faker para que você possa acessar.

Beleza, dentro da função anônima vamos retornar um array associativo com os campos ‘name’, ‘email’, ‘address’, ‘password’ e ‘rememberToken’ para inserir no User, vai ficar mais ou menos assim:

// Vamos precisar do Str
use Illuminate\Support\Str;
$factory->define(User::class, function (Faker $faker) {
return [
// O campo name vai receber um nome aleatório
'name' => $faker->name,
// O email vai receber um e-mail aleatório e sem repetição
'email' => $faker->unique()->safeEmail,
// Mesmo esquema para o address
'address' => $faker->address(),
// Para a senha vai ser uma cidade aleatória
'password' => bcrypt($faker->city()),
// O token será uma string aleatória de 10 caracteres
'remember_token' => Str::random(10),
];
});

Executando a Factory

Registros inseridos (visão do MySQL Workbench)

Para rodar a Factory é necessário uma seed que a execute, se você não sabe o que são seeds, eu também escrevi um artigo sobre, mas basicamente, seeds são responsáveis por inserir registros no DB, a diferença é que ela insere registros fixos, aqui vamos usar ela de uma maneira que ela possa inserir baseada nas configurações da Factory, então bora lá:

php artisan make:seeder UsersTableSeeder

Você vai encontrar a seed dentro de database/seeds/UsersTableSeeder.php, dentro do método run da seeder, vamos invocar o método Factory, o primeiro parâmetro é o model da tabela a ser populada e o segundo é a quantidade de registros a serem inseridos, logo em seguida é encadeado o método ‘create’.

Fica mais ou menos assim:

public function run()
{
// Dentro da tabela User, crie 50 registros
factory(App\User::class, 50)->create();
}

Na seeder isso já é o suficiente, agora quando a rodarmos, ela vai inserir os 50 registros especificados, ou seja, no fim das contas, nós executamos uma seeder e essa seeder vai executar o factory para inserir os registros várias vezes.

Já que a seed é quem irá inserir os dados, para rodar ela é só digitar:

php artisan db:seed --class=UsersTableSeeder
Mensagem de sucesso do Artisan

Conclusão

O que achou desse recurso? Uma mão na roda na hora de desenvolver/testar a aplicação né?

Pode parecer complexo ou chato fazer todas essas configurações, mas vale levar em conta que quando fazemos as configurações, elas só são feitas uma única vez, se quiser mais 50 registros é só rodar o comando mais uma vez, se quiser mais 1000, é só mudar o 50 por 1000 e rodar o comando, quanto tempo você levaria pra inserir esses registros?

Bom, espero que o artigo tenha sido proveitoso e que você provavelmente tenha uma nova carta na manga no momento de desenvolver sua aplicação, não se esqueça de ler a documentação oficial do Laravel e do Factory.

Bons Estudos!

--

--

No responses yet