Trong phiên bản mới nhất của Laravel 4, bạn xác định thứ tự tất cả các kịch bản lệnh giống được chạy trong phương thức "chạy" của lớp DatabaseSeeder.
public function run()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->call('PrimaryTableOneSeeder');
$this->command->info('The first primary table has been seeded!');
$this->call('PrimaryTableTwoSeeder');
$this->command->info('The second primary table has been seeded!');
$this->call('PivotTableSeeder');
$this->command->info('The pivot table has been seeded!');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
Bạn sẽ nhận thấy rằng tôi vô hiệu hóa các ràng buộc khóa ngoài trước và sau khi chạy tất cả các nhánh của mình. Đây có thể là thực hành không tốt nhưng đó là cách duy nhất tôi có thể sử dụng chức năng cắt ngắn để thiết lập lại số id cho mỗi bảng. Nếu bạn làm theo hướng dẫn trên inserting related models, thực hành này có thể không cần thiết.
class PrimaryTableOneSeeder extends Seeder {
public function run()
{
DB::table('primaryone')->truncate();
Primaryone::create(array(
'field' => 'value',
'created_at' => new DateTime,
'updated_at' => new DateTime
));
}
Để sử dụng mass assignment như tôi đang làm trong ví dụ của tôi và là phiên bản mới nhất của tài liệu hướng dẫn thực hiện, bạn sẽ cần phải xác định một trong hai số cột bảo vệ hoặc để điền và mô hình. Để làm điều này, chỉ cần thêm thuộc tính vào mô hình của bạn như sau:
class Primaryone extends Eloquent {
protected $guarded = array('id');
Tôi có thể nói đây là câu trả lời đúng. Nếu tôi là bạn tôi sẽ không vô hiệu hóa kiểm tra khóa nước ngoài. Nó có thể được thảo luận về thời tiết tốt để cắt ngắn các bảng là tốt. Tôi sẽ không làm điều đó, nhưng đó chỉ là tôi. Lý do là db: seed có thể chạy bất cứ lúc nào có nghĩa là db có thể có dữ liệu quan trọng trong đó. – AndHeiberg
@AndHeiberg Đó là một điểm tốt. Mọi người không nhận thức được rằng hạt giống không được dự định sử dụng trong sản xuất mà là để gieo giống cơ sở dữ liệu phát triển với dữ liệu thử nghiệm, điều đó là ok nếu nó bị cắt ngắn. Dữ liệu cho sản xuất phải được thêm vào thông qua giao diện của ứng dụng hoặc thông qua kết nối db ssh. – isimmons
Có phương pháp tương thích với sqlite không? 'SET FOREIGN_KEY_CHECKS' kích hoạt lỗi với sqlite.Đây là nơi mà vấn đề của tôi bắt nguồn: Tôi đã làm việc với một db sqlite quickie cho dev và bây giờ đang cố gắng chuyển sang postgres, chỉ để tìm ra rằng sự khoan dung của sqlite ẩn một số vấn đề. –