2016-12-18 23 views
7

Tôi đang cố gắng sửa đổi di chuyển hiện tại. Ý tôi là, đây là lớp di cư hiện tại của tôi:Làm cách nào để sửa đổi di chuyển trong Laravel?

class CreateLogForUserTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('log_for_user', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('user_id'); 
      $table->string('table_name'); 
      $table->string('error_message'); 
      $table->unsignedTinyInteger('error_code'); 
      $table->timestamps(); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('log_for_user'); 
    } 
} 

Tôi cũng đã thực hiện lệnh php artisan migrate này một lần. Bây giờ tôi cần thêm phương thức ->nullable() vào cột error_message. Vì vậy, tôi thay đổi nội dung di cư của tôi, một cái gì đó như thế này:

. 
. 
    $table->string('error_message')->nullable(); 
. 
. 

Nhưng khi tôi thực hiện php artisan migrate một lần nữa, nó nói:

Không có gì để di chuyển.

Dù sao, làm cách nào để áp dụng phiên bản di chuyển mới?

Trả lời

12

Bạn nên tạo một di dân mới sử dụng lệnh:

php artisan make:migration update_error_message_in_log_for_user_table 

Sau đó, trong đó lớp di dân tạo thêm dòng này (sử dụng change phương pháp như thế này):

class UpdateLogForUserTable extends Migration 
{ 
    public function up() 
    { 
     Schema::table('log_for_user', function (Blueprint $table) { 
      $table->string('error_message')->nullabe()->change(); 
     }); 
    } 

    public function down() 
    { 
     Schema::table('log_for_user', function (Blueprint $table) { 
      $table->string('error_message')->change(); 
     }); 
    } 
} 

Để thực hiện những lệnh thay đổi sử dụng :

php artisan migrate 

và để khôi phục các thay đổi sử dụng lệnh:

php artisan migrate:rollback 

Bạn có thể khôi phục số lượng giới hạn di chuyển bằng cách cung cấp tùy chọn bước cho lệnh rollback. Ví dụ, lệnh sau sẽ rollback lăm di cư cuối cùng:

php artisan migrate:rollback --step=5 

Xem thêm về Modifying columns with Migration

Hope this helps!

+0

Chỉ một câu hỏi, khi nào tôi nên sử dụng phương thức 'change()'? Nếu tôi muốn thêm một chỉ mục * (như 'unique()') * thay vì 'nullable()', tôi vẫn cần sử dụng 'change()' như thế này? '$ table-> string ('error_message') -> unique() -> change();' – stack

+1

Có, 'phương thức' thay đổi lệnh cho laravel sửa đổi truy vấn cụ thể đó! –

+0

@stack - theo laravel perquisite cài đặt gói này - 'composer yêu cầu doctrine/dbal' –

1

Bạn có thể sử dụng phương thức change, nó cho phép bạn sửa đổi một số loại cột hiện có thành loại mới hoặc sửa đổi thuộc tính của cột.

Ví dụ sửa đổi một cột để được nullable:

Schema::table('log_for_user', function ($table) { 
    $table->string('error_message')->nullable()->change(); 
}); 

Nhưng trước hết bạn sẽ cần gói doctrine/dbal

composer require doctrine/dba 
+0

Chỉ một câu hỏi, khi nào chính xác tôi nên sử dụng phương thức 'change()'? Nếu tôi muốn thêm một chỉ mục * (như 'unique()') * thay vì 'nullable()', tôi vẫn cần sử dụng 'change()' như thế này? '$ table-> string ('error_message') -> unique() -> change();' – stack

+0

Bạn không cần phương thức 'change' cho' unique'. Chỉ cần sử dụng nó như thế này '$ table-> unique ('error_message');' trong một tệp di chuyển mới. –

3

Nếu ứng dụng của bạn không có trong sản xuất và bạn giống dữ liệu của bạn , tốt nhất bạn có thể làm là chạy:

php artisan migrate:refresh --seed 

Lệnh này sẽ thả tất cả các bảng và tạo lại chúng. Sau đó, nó sẽ giống dữ liệu.

Nếu bạn sẽ tạo thêm di chuyển cho từng thay đổi trong quá trình phát triển, bạn sẽ kết thúc với hàng trăm lớp di chuyển.

+0

Trong trường hợp này, tập dữ liệu hiện tại sẽ bị xóa, phải không? – stack

+0

Có, dữ liệu sẽ bị mất. Nhưng đúng cách là hạt giống dữ liệu trong quá trình phát triển, nhưng không sử dụng dữ liệu thực. –

+0

Tôi hiểu. Juse một điều, những gì '--seed' không chính xác? Tôi biết những gì 'di chuyển: refresh' nào, nhưng tôi không biết những gì' --seed' không .. – stack

2

Có 2 cách để làm điều này:

  1. Run php artisan migrate:refresh. Thao tác này sẽ khôi phục tất cả các lần di chuyển của bạn và di chuyển tất cả các lần di chuyển của bạn. Nếu bạn chạy lệnh này, tất cả dữ liệu được chèn vào cơ sở dữ liệu của bạn sẽ bị mất.
  2. Chạy php artisan make:migration enter_your_migration_name_here. Sau đó chèn này trong việc di chuyển của bạn:

    $table->string('error_message')->nullable()->change();

    Sau đó chạy php artisan migrate để thực hiện thay đổi bảng của bạn. (Hãy lưu ý rằng khi bạn làm điều này, bạn có yêu cầu composer require doctrine/dbal trong nhà soạn nhạc của mình)

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