2013-08-25 28 views
8

Xin chào Tôi có vấn đề khi tạo bảng bằng trình tạo lược đồ di chuyển. Sự cố xảy ra với bảng có khóa tự tham chiếu ngoài. Đây là mã mà tạo ra lỗi:Di trú Laravel tự tham chiếu tới vấn đề chính nước ngoài

 Schema::create('cb_category', function($table) 
    { 
     $table->integer('id')->primary()->unique()->unsigned(); 
     $table->integer('domain_id')->unsigned(); 
     $table->foreign('domain_id')->references('id')->on('cb_domain'); 
     $table->integer('parent_id')->nullable(); 
     $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
     $table->string('name'); 
     $table->integer('level'); 
    }); 

Dưới đây là lỗi:

SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150) (SQL: alter table `cb_cate 

đẫm máu add constraint cb_category_parent_id_foreign foreign key ( PARENT_ID ) references cb_category ( id`) trên del ETE thác trên thác cập nhật) (Bindings: mảng ( ))

[PDOException] SQLSTATE [HY000]: Lỗi chung: 1005 Không thể tạo bảng 'eklik2. # sql-7d4_e '(errno: 150)

Bất kỳ ý tưởng nào?

Trả lời

5

Bạn phải chia thành hai khối lược đồ, một khối tạo cột, cột kia thêm các FK. mysql không thể làm cả hai cùng một lúc.

+0

Tôi có phá vỡ nó trong 2 báo cáo , dù sao vẫn còn lỗi: Giản đồ :: tạo (...); Giản đồ :: bảng ('cb_category', hàm ($ table) { $ table-> foreign ('parent_id') -> references ('id') -> on ('cb_category') -> onUpdate ('cascade ') -> onDelete (' cascade '); }); – gandra404

+1

Được giải quyết bằng vi phạm. Đây là đoạn mã: Lược đồ :: tạo ('cb_category', hàm ($ table) {...}); $ dbh = DB :: getPdo(); $ dbh-> truy vấn ("ALTER TABLE cb_category ADD CONSTRAINT fk_cb_category_parent_id NGOẠI PHÍ (parent_id) TÀI LIỆU THAM KHẢO cb_category (id) TRÊN XÓA KHÔNG CÓ HÀNH ĐỘNG CẬP NHẬT KHÔNG CÓ HÀNH ĐỘNG"); – gandra404

2

Tôi có thể là quá muộn cho bữa tiệc, nhưng các tài liệu chính thức tuyên bố rằng chính nước ngoài, trong trường hợp số nguyên, phải ->unsigned();

http://laravel.com/docs/4.2/schema#foreign-keys

Note: When creating a foreign key that references an incrementing integer, remember to always make the foreign key column unsigned.

Ngoài ra, Artisan không thất bại nếu bạn (như tôi có) misspell unsigned() và tôi đã dành một vài giờ cố gắng tìm ra lý do tại sao khóa không được tạo ra.

Vì vậy, hai điều: 1. Luôn làm cho cột khóa ngoại unsigned trong trường hợp số nguyên incrementing 2. Kiểm tra chính tả của unsigned()

1
Schema::create('cb_category', function (Blueprint $table) { 
     $table->increments('id')->unsigned(); 
     $table->integer('domain_id')->unsigned(); 
     $table->foreign('domain_id')->references('id')->on('cb_domain'); 
     $table->integer('parent_id')->nullable(); 
     $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
     $table->string('name'); 
     $table->integer('level'); 
    }); 

Hãy thử điều này

+0

Điều này có cùng vấn đề với câu hỏi. Một bảng không thể được thực hiện để tham chiếu chính nó khi nó được tạo ra, bởi vì bảng không tồn tại để tham chiếu trong khi nó đang được tạo ra, – Jason

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