Làm cho cột không thể vô hiệu trong quá trình di chuyển Laravel


128

Tôi đang viết di chuyển để tạo một số cột nhất định trong bảng nullablengay bây giờ. Đối với chức năng down, tất nhiên tôi muốn tạo not nullablelại các cột đó. Tôi đã xem qua tài liệu của trình tạo lược đồ , nhưng không thể tìm thấy cách nào để thực hiện việc này.

Bất kỳ trợ giúp sẽ được đánh giá cao.


câu trả lời hoàn hảo nhất cho câu hỏi này có thể được tìm thấy ở đây: stackoverflow.com/a/32568625/4908847
szaman

Câu trả lời:


232

Trước Laravel 5, không có cách thay đổi cột bảng hiện có nào của Laravel bằng cách sử dụng trình tạo lược đồ. Bạn cần sử dụng các truy vấn thô cho việc này.

Tuy nhiên, kể từ Laravel 5, bạn có thể sử dụng:

$table->...->nullable(false)->change();

1
Đó là những gì tôi cũng tìm thấy. Một sự liên lạc tuyệt vời sẽ dành cho trình tạo lược đồ cho phép thay đổi các định nghĩa cột, mà nó dường như không hỗ trợ. Tôi chắc rằng có nhiều người khác giống như tôi đang sử dụng trình tạo lược đồ để sửa đổi một DB hiện có, không chỉ tạo bảng từ đầu.
Sean the Bean

3
Taylor Otwell (người tạo ra Laravel) đã nói 6 ngày trước (2014-05-09): "Tôi vẫn giữ vững tuyên bố của mình rằng nếu ai có thể làm thành công và rõ ràng, tôi sẽ hợp nhất nó." github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
@Musa Rõ ràng bạn có thể đặt một cột nullable (ví dụ: $table->string('colmn', 255)->nullable()->change();) nhưng ngược lại không xuất hiện để làm việc ( $table->string('colmn', 255)->change();), vì vậy bạn vẫn cần phải sử dụng các truy vấn db liệu này
Luís Cruz

5
Xem câu trả lời của @ MattMcDonald bên dưới. Bạn có thể sử dụng nullable () để làm cho nó trở thành nullable và nullable (false) để làm cho nó Không thể nullable trong một lần di chuyển.
ajon

5
nullable(false)không hoạt động đối với tôi trong Laravel 5.3 :(
Stalinko

38

Đối với Laravel 5, có thể đảo ngược điều này nguyên bản - chỉ cần chuyển false làm đối số cho nullable ().

ví dụ

$table -> string('foo') -> nullable(false) -> change();

Nó hoạt động! Vì vậy, đây đã trở thành câu trả lời chính xác vì các bản cập nhật cho Laravel.
jlbang

Cảm ơn, mặc dù tôi không hiểu tại sao các cột không được tạo không thể null theo mặc định. Đó thường là phương pháp hay nhất và điều này làm tăng thêm nhiều nhiễu cho mã.
Morgan

1
Các cột là không rỗng theo mặc định. Người đăng chỉ hỏi cách đảo ngược một cột đã rỗng.
Matt McDonald

2

Đầu tiên hãy chạy cái này:

composer require doctrine/dbal

Sau đó, tạo một chuyển đổi sẽ thay đổi bảng như sau:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->dropColumn('column');
    });
}

4
Có lý do gì để bỏ toàn bộ cột trong quy trình khôi phục không? Phương thức down () chỉ nên hoàn tác logic của phương thức up () để hỗ trợ di chuyển qua lại và chuyển tiếp.
Andrew

1

Bạn chỉ có thể khai báo lại cột mà không cần -> nullable () và sử dụng -> thay đổi

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.