Laravel Seeding: Durante o desenvolvimento de aplicações web, é crucial ter dados de teste realistas para verificar o funcionamento das funcionalidades e a interface do usuário. O Laravel oferece uma solução elegante para esse problema: o laravel seeding
. O seeding permite popular o banco de dados com dados fictícios de forma rápida e repetível, economizando tempo e garantindo um ambiente de teste consistente.
Este artigo explora em detalhes o sistema de seeding do Laravel, desde a escrita de seeders básicos até o uso de factories e a execução de seeders adicionais.
Escrevendo Seeders
Um seeder é uma classe que contém a lógica para inserir dados no banco de dados. Para criar um novo seeder, utilize o comando Artisan make:seeder
:
Bash
php artisan make:seeder UserSeeder
Este comando criará um novo arquivo seeder em database/seeders
. O arquivo contém um método run()
onde você define a lógica de inserção:
PHP
<?php
namespace Database\Seeders;
use App\Models\User; // Importe o model que será usado
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // Importe a facade DB para queries diretas
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
public function run(): void
{
// Usando o Model para inserir dados
User::create([
'name' => 'Usuário Teste',
'email' => '[email protected]',
'password' => Hash::make('password'),
]);
// Usando o Query Builder para inserir múltiplos registros
DB::table('users')->insert([
[
'name' => 'Usuário 1',
'email' => '[email protected]',
'password' => Hash::make('password'),
],
[
'name' => 'Usuário 2',
'email' => '[email protected]',
'password' => Hash::make('password'),
],
]);
}
}
Usando Model Factories
As Model Factories são uma forma mais poderosa e flexível de gerar dados fictícios. Elas permitem definir um “modelo” de dados e gerar instâncias desse modelo com valores aleatórios. Para criar uma factory, use o comando make:factory
:
Bash
php artisan make:factory UserFactory
Isso criará um novo arquivo de factory em database/factories
. Defina os atributos do modelo na factory:
PHP
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => Hash::make('password'), // password
'remember_token' => Str::random(10),
];
}
/**
* Indicate that the model's email address should be unverified.
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
Agora, você pode usar a factory no seu seeder:
PHP
use App\Models\User;
use Database\Seeders\UserSeeder;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
public function run(): void
{
User::factory(10)->create(); // Cria 10 usuários
User::factory()->count(5)->create(); // Outra forma de criar 5 usuários
User::factory()->create(['name' => 'Nome Especifico']); // Cria um usuário com nome especifico
}
}
Você pode criar relacionamentos entre factories:
PHP
// Na factory de Post
public function definition(): array
{
return [
'user_id' => User::factory(), // Cria um usuário relacionado
'title' => fake()->sentence(),
'body' => fake()->paragraph(),
];
}
Chamando Seeders Adicionais
Você pode organizar seus seeders em classes separadas e chamá-las a partir do DatabaseSeeder
:
PHP
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CategorySeeder::class,
]);
}
}
Isso garante uma melhor organização e modularidade do seu código de seeding.
Alterando Eventos do Model
É importante notar que, por padrão, os seeders não disparam os eventos do model (como creating
, created
, updating
, etc.). Se você precisar que esses eventos sejam disparados, use o método create()
ou update()
diretamente no model ao invés da facade DB
:
PHP
// Com eventos
User::create([ /* dados do usuário */ ]);
// Sem eventos
DB::table('users')->insert([ /* dados do usuário */ ]);
Se você estiver usando Factories, os eventos dos Models serão disparados normalmente, como demonstrado nos exemplos anteriores.
Executando Seeders
Para executar os seeders, utilize o comando db:seed
:
Bash
php artisan db:seed
Para executar um seeder específico:
Bash
php artisan db:seed --class=UserSeeder
Para recarregar o banco de dados e executar os seeders novamente, use migrate:refresh --seed
ou migrate:fresh --seed
:
Bash
php artisan migrate:refresh --seed
php artisan migrate:fresh --seed
A diferença entre migrate:refresh
e migrate:fresh
é que migrate:refresh
executa o migrate:rollback
e depois o migrate
, enquanto o migrate:fresh
exclui todos os bancos de dados e executa o migrate
novamente, começando do zero.
Exemplo Completo: Seeder com Factory e Relacionamento
PHP
// Model User
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Model
{
use HasFactory;
protected $fillable = ['name', 'email', 'password'];
/**
* Get the posts for the blog post.
*/
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}
// Model Post
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Post extends Model
{
use HasFactory;
protected $fillable = ['user_id', 'title', 'body'];
/**
* Get the user that owns the comment.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
// Factory UserFactory
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => Hash::make('password'),
'remember_token' => Str::random(10),
];
}
}
//Factory PostFactory
namespace Database\Factories;
use App\Models\Post;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
protected $model = Post::class;
public function definition(): array
{
return [
'user_id' => User::factory(),
'title' => fake()->sentence(),
'body' => fake()->paragraph(),
];
}
}
// Seeder DatabaseSeeder
namespace Database\Seeders;
use App\Models\Post;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
User::factory(10)->create()->each(function ($user) {
Post::factory(rand(1, 5))->create(['user_id' => $user->id]);
});
}
}
Este exemplo cria 10 usuários e, para cada usuário, cria entre 1 e 5 posts relacionados.
Conclusão
Laravel Seeding: O laravel seeding
é uma ferramenta valiosa para o desenvolvimento e teste de aplicações Laravel. Ele permite popular o banco de dados com dados fictícios de forma rápida, repetível e organizada. O uso de Model Factories eleva o seeding a um novo nível, permitindo a geração de dados mais complexos e realistas, incluindo relacionamentos entre modelos.
Dominar o seeding é essencial para garantir um ambiente de desenvolvimento consistente e eficiente. Com os exemplos e explicações apresentados neste artigo, você está pronto para começar a usar seeders em seus projetos e aprimorar seu fluxo de trabalho.
Mas antes de dominar o Laravel, se for o seu caso, toda jornada tem um início. Vamos entender quais são os conhecimentos básicos necessários para aproveitar ao máximo este poderoso framework. Para iniciar seus estudos no Laravel, você precisará dominar as seguintes tecnologias:
E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados: