Tìm hiểu Seeding trong Laravel
Bài đăng này đã không được cập nhật trong 5 năm
Giới thiệu
- Laravel cung cấp phương pháp dễ dàng tạo dữ liệu mẫu trong database bằng các lớp seed.
- Các lớp seed nằm trong thư mục
database/seeds
.
- Các lớp seed có thể được đặt tên bất kỳ, nhưng nên được đặt theo một số quy tắc, VD
PostsTableSeeder
. - Mặc định lớp
DatabaseSeeder
được tạo sẵn, trong lớp này bạn có thểcall
các seed khác.
Tạo Seeders
- Để tạo một seed ta dùng lệnh
php artisan make:seed [tên_seed]
.
<?php
use Illuminate\Database\Seeder;
class PostsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
- Một lớp seed chỉ chứa phương thức mặc định
run
. - Phương thức này sẽ được gọi khi chạy lệnh artisan cmd
php artisan db:seed
. - Trong phương thức
run
ta sẽ insert dữ liệu.
public function run()
{
$posts = [
[
'id' => 1,
'title' => 'Lập trình PHP',
'slug' => str_slug('Lập trình PHP'),
'content' => '....',
'category_id' => rand(1,3),
],
[
'id' => 2,
'title' => 'Lập trình Ruby',
'slug' => str_slug('Lập trình Ruby'),
'content' => '....',
'category_id' => rand(1,3),
]
];
try {
foreach ($posts as $post) {
Post::create($post);
}
} catch (\Throwable $th) {
}
}
Sử dụng Factory
- Tùy vào nhu cầu người dùng có thể insert dữ liệu bằng tay hay sử dụng sử liệu random.
- Sử dụng model factory để tạo ra nhiều bản ghi.
- Để tạo factory ta dùng lệnh
php artisan make:factory [tên_factory]
VD: PostFactory
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Model;
use Faker\Generator as Faker;
$factory->define(Model::class, function (Faker $faker) {
return [
//
];
});
- Ta cần sửa lại model và bắt đầu insert dữ liệu, ở dưới đây tôi sử dụng faker để tạo dữ liệu mẫu.
- Một số faker mẫu.
# | Cú pháp | Kết quả ví dụ |
---|---|---|
1 | $faker->randomDigit | 7 |
2 | $faker->word | 'aut' |
3 | $faker->name | 'Dr. Zane Stroman' |
4 | $faker->address | '8888 Cummings Vista Apt. 101, Susanbury, NY 95473' |
5 | $faker->phoneNumber | '201-886-0269 x3767' |
6 | $faker->company | 'Bogan-Treutel' |
7 | $faker->text | 'Dr. Zane Stroman' |
9 | $faker->dateTime($max = 'now', $timezone = null) | DateTime('2008-04-25 08:37:17', 'UTC') |
10 | $faker->email | 'tkshlerin@collins.com' |
11 | $faker->chrome | 'Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_5) AppleWebKit/5312 (KHTML, like Gecko) Chrome/14.0.894.0 Safari/5312' |
12 | $faker->hexcolor | '#fa3cc2' |
13 | $faker->fileExtension | 'avi' |
14 | $faker->imageUrl($width = 640, $height = 480) | URL ảnh có kích thước 640 x 480 |
15 | $faker->uuid | '7e57d004-2b97-0e7a-b45f-5387367791cd' |
16 | $faker->ean13 | '4006381333931' |
17 | $faker->md5 | 'de99a620c50f2990e87144735cd357e7' |
18 | $faker->randomHtml(2,3) | Tạo tài liệu HTML sâu không quá 2 cấp và rộng không quá 3 phần tử ở mọi cấp. |
$factory->define(Post::class, function (Faker $faker) {
$title = $faker->text(10);
return [
'title' => $title,
'slug' => str_slug($title),
'content' => $faker->text(100),
'category_id' => rand(1,3),
];
});
- Sau khi định nghĩa sau thì trong hàm
run
của lớpPostsTableSeeder
ta chỉ cần gọifactory(tên_lớp, số_lượng)->create()
.
public function run()
{
factory(Post::class, 100)->create();
}
Gọi Seeders
- Trong lớp DatabaseSeeder, ta có thể
call
các lớp seed khác.
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(CategoriesTableSeeder::class);
$this->call(PostsTableSeeder::class);
}
}
- Chú ý khi
call
các lớp phải theo thứ tự quan hệ. VD: Ở trên ta chạyCategoriesTableSeeder
trước vìPostsTableSeeder
cần cócategory_id
để insert vào trong cột category_id củaPostsTableSeeder
.
Chạy Seeders
- Trước khi chạy bạn nên load lại các file sử dụng
composer dump-autoload
- Sử dụng
php artisan db:seed
để chạy tất cả các file đượccall
trong lớpDatabaseSeeder
. - Chỉ định seed một lớp
php artisan db:seed --class=UsersTableSeeder
. - Sử dụng
php artisan migrate:fresh --seed
để xóa tất cả các bảng sau đó chạy lại các bảng và seed.
Kết luận
- Seed cho phép tạo dữ liệu mẫu nhanh chóng và tái sử dụng lại.
- Với thư viện Faker cho phép tạo những dữ liệu mẫu đúng với thực tế hơn.
- Thuật lợi cho quá trình phát triển và kiểm thử ứng dụng.
Tài liệu tham khảo
All rights reserved