Tôi đã cố gắng tạo hai bảng với bảng thứ hai có khóa ngoại tham chiếu đến bảng đầu tiên
bàn đầu tiên
increments['id'];
$table->string['name'];
$table->timestamps[];
}];
}
bàn thứ hai
increments['id'];
$table->foreign['product_id']->references['id']->on['products'];
$table->string['price'];
$table->timestamps[];
}];
}
Có lỗi này khi nhìn vào mắt tôi.
______6
Sau khi mò mẫm đây đó trên internet. Có vẻ như việc gọi trực tiếp phương thức nước ngoài không tạo cột có tham chiếu, điều mà bộ não ngớ ngẩn của tôi đã nghĩ. Vì vậy, tôi đã viết lại bảng thành như thế này
public function up[]
{
Schema::create['product_prices', function[$table]{
$table->increments['id'];
$table->integer['product_id'];
$table->foreign['product_id']->references['id']->on['products'];
$table->string['price'];
$table->timestamps[];
}];
}
Bây giờ một lỗi khác nhìn thẳng vào mắt tôi.
______7
Sau vài phút mò mẫm, tôi nhận ra các cột tương ứng trong khóa ngoại và khóa được tham chiếu phải có kiểu dữ liệu giống nhau. Kích thước và dấu của các loại số nguyên phải giống nhau. phương thức gia số [] đặt một số nguyên không dấu với số gia tự động theo mặc định trong db mysql
Đây là một mẹo nhỏ dành cho các nhà phát triển Laravel có kinh nghiệm hơn. Các nhà phát triển Laravel đã làm việc với framework trong một thời gian dài có thể đã bỏ lỡ cải tiến di chuyển nhỏ nhưng tốt đẹp này
Trước đây, để đặt khóa foregin, trước tiên bạn phải thêm một unsignedBigInteger
vào tên của cột, sau đó, thông thường ở cuối cuộc gọi lại, bạn sẽ sử dụng phương thức foreign[]
kế hoạch chi tiết, chuyển tên cột cho nó, sau đó
1Schema::create['events', function [Blueprint $table] {
3 $table->unsignedBigInteger['user_id'];
4 $table->unsignedBigInteger['person_id'];
7 $table->string['repeat_every'];
8 $table->string['notify_days_before'];
11 $table->foreign['user_id']->references['id']->on['users']->onDelete['cascade'];
12 $table->foreign['person_id']->references['id']->on['people']->onDelete['cascade'];
Tuy nhiên, trong các phiên bản mới hơn của Laravel, có một cách tốt hơn để làm điều này
Thay vì unsignedBigInteger
, chúng ta có thể làm
1Schema::create['events', function [Blueprint $table] {
3 $table->foreignId['user_id']->constrained[]->onDelete['cascade'];
4 $table->foreignId['person_id']->constrained[]->onDelete['cascade'];
7 $table->string['repeat_every'];
8 $table->string['notify_days_before'];
Bây giờ, phương thức
increments['id'];
$table->foreign['product_id']->references['id']->on['products'];
$table->string['price'];
$table->timestamps[];
}];
}
1 sẽ sử dụng các quy ước để xác định tên bảng và cột được tham chiếu, nhưng nếu tên bảng của bạn bằng cách nào đó không khớp, bạn có thể chuyển nó làm đối số 1Schema::create['events', function [Blueprint $table] {
3 $table->foreignId['user_id']->constrained['users']->onDelete['cascade'];
4 $table->foreignId['person_id']->constrained['people']->onDelete['cascade'];
7 $table->string['repeat_every'];
8 $table->string['notify_days_before'];
Đó là nó
Thông thường, tôi không hào hứng với đường cú pháp, nhưng điều này tốt hơn nhiều
Không chỉ vì nó ngắn hơn và biểu cảm hơn, mà còn vì nó giúp mã dễ xóa hơn - và mã dễ xóa luôn tốt hơn
Hướng dẫn này chỉ cho bạn cách thêm khóa ngoại trong quá trình di chuyển laravel. nếu bạn muốn xem ví dụ về di chuyển laravel thêm ràng buộc khóa ngoại thì bạn đã đến đúng nơi. tôi muốn cho bạn thấy bảng tạo bảng di chuyển laravel với khóa ngoại. bạn sẽ học cách tạo bảng khóa ngoại laravel. Vì vậy, hãy làm theo vài bước để tạo ví dụ về laravel migration tạo bảng với khóa ngoại
Tôi sẽ cung cấp cho bạn ví dụ rất đơn giản về cách tạo bảng có ràng buộc khóa ngoại bằng cách sử dụng di chuyển laravel. bạn có thể dễ dàng sử dụng ví dụ này với phiên bản laravel 6, laravel 7, laravel 8 và laravel 9
trong ví dụ này, chúng tôi sẽ tạo bảng "bài đăng" và "bình luận". trong bảng nhận xét, chúng tôi sẽ thêm hai ràng buộc khóa ngoại, một ràng buộc với bài đăng và một ràng buộc khác với bảng người dùng. Vì vậy, hãy tạo di chuyển đơn giản và hãy xem