Tạo Mock Data cho Testing và Development
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,
]);
<?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...
];
}
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
php artisan migrate:fresh --seed để reset database với mock data khi
develop.