2013-02-02 33 views

Trả lời

41

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'); 
+1

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

+1

@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

+0

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 đề. –

0

Việc ghép giống là thông tin đơn giản, dữ liệu thử nghiệm và thông tin tĩnh. Tôi sẽ không khuyên bạn nên sử dụng nó để xử lý các mối quan hệ. Cá nhân, tôi chỉ sử dụng nó cho 2 hoặc 3 bản ghi cho mỗi bảng, để giúp kiểm tra ứng dụng của tôi.

Khi phát triển ứng dụng của bạn, trước hết hãy nghĩ đến việc làm việc trên khu vực nhập dữ liệu (quản trị) trước rồi đến giao diện người dùng. Bằng cách đó bạn có thể dễ dàng thêm dữ liệu thử nghiệm.

+1

Tôi đồng ý, nhưng ngay cả khi bạn có việc nhập dữ liệu dễ dàng vẫn quan trọng và hữu ích. Vì vậy, trừ khi bạn có một số cách để chuyển đổi các đầu vào quản trị thành hạt giống là điều này thực sự trả lời câu hỏi của tôi? – AndHeiberg

3

Tệp hạt giống Laravel là các tập lệnh PHP thông thường (trừ khi chúng cần trả về mảng). Bạn có thể truy vấn cơ sở dữ liệu trong các tệp hạt giống (sử dụng Eloquent, trình tạo thông thạo hoặc thậm chí PDO).

Một cách để giải quyết sự cố nhiều người là cố ý đặt tên tệp hạt giống để bảng tổng hợp được điền cuối cùng ... Ví dụ: bạn có thể thêm một giá trị số vào tên tệp (ví dụ: 1_authors. php, 2_books.php, 3_authors_books.php, v.v.). Artisan sắp xếp tên tập tin theo thứ tự bảng chữ cái trước khi thực hiện chúng.

Tôi đã đăng một hướng dẫn nhỏ trên Laravel 4 database seeding - điều này sẽ giúp bạn tiếp tục. Ngoài ra, bạn có thể tham khảo tài liệu chính thức trên seeding.

Các vấn đề liên quan