Laravel có khả năng tạo cơ sở dữ liệu cùng dữ liệu bằng các class seed. Tất cả các class seed được lưu trong thư mục database/seeders
. 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.
Note 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.
Để 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/seeders
:
php artisan make:seeder UserSeeder
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.
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
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}
Note 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à mỗi người dùng đó có một quan hệ post:
use App\Models\User;
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
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. Phương thức call
chấp nhận một mảng các class seeder sẽ được thực thi:
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
Trong khi chạy seed, bạn có thể muốn ngăn các model gửi event. Bạn có thể thực hiện điều này bằng cách sử dụng trait WithoutModelEvents
. Khi được sử dụng, trait WithoutModelEvents
này sẽ đảm bảo không có event model nào được gửi đi, ngay cả khi các class seed bổ sung được thực thi thông qua chạy phương thức call
:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
$this->call([
UserSeeder::class,
]);
}
}
Bạn có thể chạy 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 Database\Seeders\DatabaseSeeder
để có thể 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=UserSeeder
Bạn cũng có thể tạo lại cơ sở dữ liệu cho bạn bằng lệnh migrate:fresh
cùng với tùy chọn --seed
, lệnh này sẽ xoá tất cả các bảng 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. Tùy chọn --seeder
có thể được sử dụng để chỉ định một seeder cụ thể sẽ được chạy:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
Một số thao tác seeding có thể khiến dữ liệu của bạn bị thay đổi hoặc bị mất. Để bảo vệ bạn khỏi việc chạy các lệnh seeding trên các cơ sở dữ liệu production, bạn sẽ được nhắc xác nhận trước khi seeder được chạy trong môi trường production. Để buộc seeder chạy mà không có nhắc xác nhận, hãy sử dụng flag --force
:
php artisan db:seed --force
entry