Khi chạy di chuyển laravel, tôi đang gặp phải sự bất tiện nhỏ. Tôi sử dụng Laravel 5.1.Di chuyển Laravel cách tốt để vô hiệu hóa các kiểm tra khóa ngoài
Vì có rất nhiều bảng có nhiều mối quan hệ, nên tôi có thể đổi tên tệp di chuyển để chúng chạy đúng thứ tự, do đó không có ràng buộc khoá ngoại nào bị vi phạm. Đây là những gì tôi đã làm một lần trong quá khứ, và nó là rất không thực tế.
Những gì tôi đang làm bây giờ là xác định từng di cư như thế này:
class CreateSomeTable extends Migration
{
public function up()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
// my table definitions go here
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
// drop table
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
}
Vấn đề ở đây là nó tẻ nhạt để viết và nó clutters lên mã. Tôi cũng nghĩ đến việc tạo hai tệp di chuyển giả, mục đích duy nhất của nó là kích hoạt và vô hiệu hóa các kiểm tra khóa ngoài, và tôi sẽ đặt tên chúng theo cách mà chúng chạy ở đầu và cuối của mỗi lần di chuyển.
Nếu có giải pháp thanh lịch, bạn cũng có thể áp dụng nó cho quy trình gieo hạt vì điều này có xu hướng là vấn đề ở đó.
Đây rõ ràng là một giải pháp rất ngẫu hứng, và tôi hỏi liệu có cách nào tốt hơn để làm điều đó không. Có một số phương pháp beforeMigrate
và afterMigrate
mà tôi có thể ghi đè hoặc điều gì đó dọc theo các dòng đó không?
Và nếu không, bạn sẽ làm thế nào?
Mọi thông tin chi tiết sẽ được đánh giá cao, tôi không thích tất cả các tùy chọn tôi đã nêu.
Họ nên luôn luôn chạy theo thứ tự chính xác nếu bạn sử dụng thợ thủ công để tạo ra sự di cư và họ có timestamps đúng . Chúng chạy theo thứ tự các dấu thời gian. – Karl
Vâng, đó là ý của tôi khi được nhắc đến thứ tự tập tin. Vấn đề là, đôi khi bạn không tạo ra chúng đúng thứ tự, hoặc đôi khi bạn có thể có sự phụ thuộc theo chu kỳ tức là cả hai bảng đều có khóa ngoại đề cập đến nhau. Không có vấn đề gì trong thứ tự bạn chạy ví dụ đó, bạn sẽ nhận được một ngoại lệ ràng buộc khóa ngoại trừ khi bạn vô hiệu hóa các kiểm tra. – Pavlin
Cách tốt nhất để tránh vấn đề này là tạo ra một di chuyển với việc tạo bảng đầu tiên và sau đó tạo một/loại bỏ khóa khác. –