Để tạo seeder, bạn có thể sử dụng lệnh Artisan make:seeder
. Tất cả các seeder được tạo sẽ được đặt trong thư mục database/seeds
$ php artisan make:seeder MoviesTableSeeder
Seeders được tạo sẽ chứa một phương thức. run
. Bạn có thể chèn dữ liệu vào cơ sở dữ liệu của mình theo phương pháp này
'A New Hope',
'year' => '1977'
]];
App\Movie::create[[
'name' => 'The Empire Strikes Back',
'year' => '1980'
]];
}
}
Nhìn chung, bạn sẽ muốn gọi tất cả các seeder bên trong lớp DatabaseSeeder
Khi bạn viết xong các seeder, hãy sử dụng lệnh
'A New Hope',
'year' => '1977'
]];
App\Movie::create[[
'name' => 'The Empire Strikes Back',
'year' => '1980'
]];
}
}
0. Điều này sẽ chạy chức năng run
của DatabaseSeeder
Cơ chế di chuyển của Laravel có chức năng gieo dữ liệu tuyệt vời. Trong bài viết này, tôi sẽ chỉ ra các mẹo ngẫu nhiên từ kinh nghiệm của bản thân, cách sử dụng seeding trong các trường hợp thực tế
Mẹo 1. Sử dụng updateOrCreate[] để tránh double-seeding
Hãy tưởng tượng mã trình tạo này và tưởng tượng nếu vì lý do nào đó, trình tạo này sẽ được khởi chạy nhiều lần
public function run[]
{
$items = [
['id' => 1, 'title' => 'Administrator'],
['id' => 2, 'title' => 'Simple user'],
];
foreach [$items as $item] {
Role::create[$item];
}
}
Lần thử thứ hai để chạy seeder có thể sẽ thất bại do ID xung đột. Trong trường hợp khác, nếu bạn không chỉ định ID, thì bạn có thể có quá nhiều dữ liệu trong bảng, với các mục lặp lại. Để tránh điều đó, hãy làm điều này
foreach [$items as $item] {
Role::updateOrCreate[['id' => $item['id']], $item];
}
Một số chi tiết khác trong bài viết khác của tôi
Mẹo 2. Chỉ chạy một lớp Seeder
Cách đây một thời gian, tôi khá ngạc nhiên khi có nhiều người không biết rằng bạn có thể chỉ định lớp seeder khi chạy php artisan db. hạt giống
php artisan db:seed
Lệnh trên sẽ khởi chạy mọi thứ được liệt kê trong DatabaseSeeder. tập tin php
Nhưng bạn có thể giới hạn việc khởi chạy cho một máy gieo hạt chính xác
php artisan db:seed --class=UsersTableSeeder
Mẹo 3. Chạy lớp Seeder từ Migration
Khá thường xuyên, bạn cần tạo một bảng DB mới và ngay lập tức tạo một số dữ liệu cho nó. Nhưng trong môi trường sản xuất, bạn không thể chạy "artisan db. seed", đặc biệt nếu bạn có thiết lập triển khai tự động chỉ liên quan đến lệnh "artisan migration"
Mẹo nhỏ là khởi chạy một seeder cụ thể từ chính tệp di chuyển
public function up[]
{
Schema::create['themes', function [Blueprint $table] {
$table->increments['id'];
$table->text['name'];
}];
Artisan::call['db:seed', [
'--class' => ThemesTableSeeder::class
]];
}
Mẹo 4. Nhà máy gieo hạt có mối quan hệ. Sử dụng Nhà máy của Cha mẹ
Nếu bạn sử dụng Nhà máy cho hạt giống của mình, làm thế nào để bạn thiết lập mối quan hệ giữa hai mô hình?
Đây là cách cơ sở dữ liệu/nhà máy/CompanyFactory. php có thể trông giống như
Xem cách điền vào trường company_id?
Ngoài ra còn có một cách khác, có lẽ ít phổ biến hơn - đọc về nó trong một bài báo khác của tôi
Mẹo 5. DatabaseSeeder cho địa phương và sản xuất
Đôi khi bạn chỉ cần tạo một số dữ liệu trong môi trường cục bộ của mình chứ không phải trong sản xuất. Hoặc, sử dụng các tệp seeder khác nhau cho các môi trường khác nhau
Không chắc đó có phải là cách thanh lịch nhất hay không, nhưng đây là cách trước đây tôi đã đạt được các cách gieo hạt khác nhau cho môi trường sản xuất và địa phương
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run[]
{
if [app[]->environment[] == 'production'] {
$this->call[ThemesTableSeeder::class];
$this->call[LanguagesTableSeeder::class];
} else {
$this->call[UsersTableSeeder::class];
$this->call[ModulesTableSeeder::class];
$this->call[ThemesTableSeeder::class];
$this->call[LanguagesTableSeeder::class];
}
}
}
Mẹo 6. Sử dụng iSeed để tạo Seeder từ cơ sở dữ liệu
Mẹo cuối cùng thực sự là một công cụ mà tôi đã sử dụng khá nhiều lần, nó được gọi là iSeed Generator
Đây là video của tôi về nó
Đó là nó. Mẹo "chung" cuối cùng là tạo các seeder của bạn theo cách mà trên môi trường cục bộ/dàn dựng của bạn, bạn có thể chạy "artisan migration. tươi --seed" nhiều lần một cách an toàn mà không làm mất bất kỳ dữ liệu quan trọng nào, nhưng trên môi trường sản xuất, bạn cần chạy "artisan db. seed" chỉ một lần và sau đó quên đi seeder. Nếu bạn cần chạy một số hạt giống trong quá trình sản xuất, hãy đưa nó vào quá trình di chuyển, xem Mẹo 3