Laravel có chứa một phương thức đơn giản để tạo cơ sở dữ liệu cho việc test bằng cách sử dụng các class Seed. Tất cả các class Seed được lưu trong thư mục database/seeds
. Các class Seed có thể có bất kỳ tên nào mà bạn muốn, nhưng có lẽ nên tuân theo một số quy ước hợp lý, chẳng hạn như UsersTableSeeder
, vv... Mặc định, một class DatabaseSeeder
đã được định nghĩa sẵn cho bạn. Từ class này, bạn có thể sử dụng phương thức call
để chạy các class seed khác nhau của bạn, cho phép bạn kiểm soát thứ tự được tạo.
Để tạo một file seed, hãy chạy Lệnh Artisan make:seeder
. Tất cả các seeder được tạo ra bởi lệnh này sẽ được lưu trong thư mục database/seeds
:
php artisan make:seeder UsersTableSeeder
Một class seeder chỉ chứa một phương thức mặc định là: run
. Phương thức này được gọi khi Lệnh Artisan db:seed
được chạy. Trong phương thức run
, bạn có thể thêm dữ liệu vào cơ sở dữ liệu của bạn theo cách mà bạn mong muốn. Bạn có thể sử dụng query builder để thêm dữ liệu theo cách thủ công hoặc bạn có thể sử dụng Eloquent model factories.
{tip} Chế độ bảo vệ mass assignment sẽ tự động bị vô hiệu hóa trong quá trình tạo cơ sở dữ liệu.
Ví dụ, hãy sửa class DatabaseSeeder
mặc định và thêm một câu số câu lệnh thêm cơ sở dữ liệu vào trong phương thức run
:
<?php
use Illuminate\Support\Str;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
{tip} Bạn có thể khai báo bất kỳ phụ thuộc nào mà bạn cần trong phương thức
run
. Những phụ thuộc đó sẽ được tự động resolve thông qua Laravel service container.
Tất nhiên, việc khai báo thủ công các thuộc tính cho từng model seed sẽ rất cồng kềnh. Thay vào đó, bạn có thể sử dụng model factories để tạo ra một lượng lớn các bản ghi cho cơ sở dữ liệu. Trước tiên, hãy xem lại tài liệu model factory để tìm hiểu cách định nghĩa factory cho bạn. Khi bạn đã định nghĩa các factory của bạn rồi, bạn có thể sử dụng hàm helper factory
để thêm các bản ghi vào trong cơ sở dữ liệu.
Ví dụ: hãy tạo 50 người dùng và gán một quan hệ với mỗi người dùng đó:
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create()->each(function ($user) {
$user->posts()->save(factory(App\Post::class)->make());
});
}
Trong class DatabaseSeeder
, bạn có thể sử dụng phương thức call
để gọi các class seed khác. Sử dụng phương thức call
cho phép bạn chia nhỏ cơ sở dữ liệu của bạn thành nhiều file, để không có một class seeder nào trở nên quá lớn. Hãy truyền vào một tên class seeder mà bạn mong muốn chạy:
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call([
UsersTableSeeder::class,
PostsTableSeeder::class,
CommentsTableSeeder::class,
]);
}
Khi bạn đã viết xong seeder của bạn, bạn có thể cần phải tạo lại autoloader của Composer bằng lệnh dump-autoload
:
composer dump-autoload
Bây giờ bạn có thể sử dụng lệnh Artisan db:seed
để tạo cơ sở dữ liệu cho bạn. Mặc định, lệnh db:seed
sẽ chạy trên class DatabaseSeeder
để gọi sang các class seed khác. Tuy nhiên, bạn có thể sử dụng tùy chọn --class
để chỉ định một class seeder cụ thể sẽ được chạy:
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
Bạn cũng có thể tạo cơ sở dữ liệu cho bạn bằng lệnh migrate:refresh
, lệnh này cũng sẽ rollback và chạy lại tất cả các migration của bạn. Nó sẽ hữu ích khi bạn building lại hoàn toàn cơ sở dữ liệu của bạn:
php artisan migrate:refresh --seed
entry