🏭

Model Factories

Tạo Factory

php artisan make:factory PostFactory
<?php
// database/factories/PostFactory.php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    public function definition(): array
    {
        return [
            'user_id' => User::factory(),
            'title' => fake()->sentence(),
            'slug' => fake()->slug(),
            'content' => fake()->paragraphs(5, true),
            'excerpt' => fake()->paragraph(),
            'status' => fake()->randomElement(['draft', 'published']),
            'views' => fake()->numberBetween(0, 10000),
            'published_at' => fake()->optional(0.7)->dateTimeBetween('-1 year'),
            'created_at' => fake()->dateTimeBetween('-2 years'),
        ];
    }

    // States - variations
    public function published(): static
    {
        return $this->state(fn (array $attributes) => [
            'status' => 'published',
            'published_at' => now(),
        ]);
    }

    public function draft(): static
    {
        return $this->state(fn (array $attributes) => [
            'status' => 'draft',
            'published_at' => null,
        ]);
    }

    public function popular(): static
    {
        return $this->state(fn (array $attributes) => [
            'views' => fake()->numberBetween(10000, 100000),
        ]);
    }
}

// Sử dụng
$post = Post::factory()->create();
$posts = Post::factory()->count(10)->create();

// Với states
$post = Post::factory()->published()->create();
$posts = Post::factory()->draft()->count(5)->create();

// Với relationships
$user = User::factory()
    ->has(Post::factory()->count(5)->published())
    ->has(Comment::factory()->count(10))
    ->create();

// Override attributes
$post = Post::factory()->create([
    'title' => 'Custom Title',
    'user_id' => $specificUser->id,
]);

Faker - Dữ liệu Tiếng Việt

<?php
// config/app.php
'faker_locale' => 'vi_VN',

// Hoặc trong factory
public function definition(): array
{
    $faker = \Faker\Factory::create('vi_VN');
    
    return [
        'name' => $faker->name(),           // Nguyễn Văn A
        'phone' => $faker->phoneNumber(),   // 0901234567
        'address' => $faker->address(),     // Địa chỉ tiếng Việt
        'city' => $faker->city(),           // Hà Nội, TP.HCM...
    ];
}
🌱

Database Seeders

Tạo Seeders

php artisan make:seeder UserSeeder
php artisan make:seeder PostSeeder
<?php
// database/seeders/DatabaseSeeder.php

namespace Database\Seeders;

use App\Models\User;
use App\Models\Post;
use App\Models\Category;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        // Call other seeders
        $this->call([
            CategorySeeder::class,
            UserSeeder::class,
            PostSeeder::class,
        ]);
    }
}

// database/seeders/UserSeeder.php
class UserSeeder extends Seeder
{
    public function run(): void
    {
        // Admin user
        User::factory()->create([
            'name' => 'Admin',
            'email' => '[email protected]',
            'is_admin' => true,
        ]);

        // Regular users with posts
        User::factory()
            ->count(20)
            ->has(
                Post::factory()
                    ->count(rand(3, 10))
                    ->state(fn() => [
                        'category_id' => Category::inRandomOrder()->first()->id,
                    ])
            )
            ->create();
    }
}

// Chạy seeder
// php artisan db:seed
// php artisan db:seed --class=UserSeeder
// php artisan migrate:fresh --seed
💡 Development Workflow: Dùng php artisan migrate:fresh --seed để reset database với mock data khi develop.
← Bài 9: Notifications Bài 11: Unit Testing →