Thêm một cột mới vào bảng hiện có trong di chuyển


270

Tôi không thể tìm ra cách thêm một cột mới vào bảng cơ sở dữ liệu hiện tại của mình bằng cách sử dụng khung công tác Laravel.

Tôi đã cố chỉnh sửa tệp di chuyển bằng ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

Trong thiết bị đầu cuối, tôi thực hiện php artisan migrate:installmigrate.

Làm cách nào để thêm cột mới?


Sẽ rất hữu ích nếu bạn có thể bao gồm bất kỳ lỗi nào bạn gặp phải; bạn mong đợi điều gì sẽ xảy ra; và những gì thực sự xảy ra?
Phill Sparks

9
Câu hỏi tuyệt vời. Có rất nhiều tài liệu di chuyển ngoài đó, và nó cho bạn thấy API và cách tạo bảng THỜI GIAN ĐẦU TIÊN. Sau đó, tất cả đều thất bại khi bạn phát triển ứng dụng của mình nhiều hơn và cần sửa đổi cấu trúc db của bạn.
Andrew Koper

Câu trả lời:


611

Để tạo di chuyển, bạn có thể sử dụng lệnh di chuyển: tạo lệnh trên Artisan CLI. Sử dụng tên cụ thể để tránh xung đột với các mô hình hiện có

cho Laravel 3:

php artisan migrate:make add_paid_to_users

cho Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Sau đó, bạn cần sử dụng Schema::table()phương thức (khi bạn đang truy cập vào một bảng hiện có, không tạo một bảng mới). Và bạn có thể thêm một cột như thế này:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

và đừng quên thêm tùy chọn rollback:

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

Sau đó, bạn có thể chạy di chuyển của bạn:

php artisan migrate

Tất cả điều này được đề cập đầy đủ trong tài liệu cho cả Laravel 3:

Và đối với Laravel 4 / Laravel 5:

Biên tập:

sử dụng $table->integer('paid')->after('whichever_column');để thêm trường này sau cột cụ thể.


3
Chỉ cầnphp artisan migrate
Phill Sparks

Có gì đó không đúng ở đây. Tôi tạo "db: make" để tạo tệp di chuyển mới. Và sau đó tôi đặt Schema :: bảng ('users', function ($ table) {$ table-> số nguyên ('trả');}); vào nó Và chạy "php artisan di chuyển", nhưng gặp phải lỗi nghiêm trọng: Không thể xác định lại lớp Người dùng trong /
Appluggest/XAMPP/xamppfiles/htdocs/adsense/application/migations / 2013_05_28_122527_users.php

Tạo di chuyển cũng được đề cập trong tài liệu. Bạn nên đặt cho nó một tên cụ thể hơn, như "add_paid_to_users", bằng cách này, nó sẽ không xung đột với xung đột mô hình của bạn.
Phill Sparks

Có vẻ như bất kỳ URL tài liệu nào của Laravel 3 đang chuyển hướng đến tài liệu của Laravel 4. Dưới đây là các liên kết đến 3 doc cho trình tạo và di chuyển lược đồ

6
Kể từ Laravel 5, lệnh này sẽ trở thànhphp artisan make:migration add_paid_to_users
mikelovelyuk

64

Tôi sẽ thêm vào câu trả lời của mike3875 cho những độc giả tương lai bằng cách sử dụng Laravel 5.1 trở đi.

Để làm mọi thứ nhanh hơn, bạn có thể sử dụng cờ "--table" như thế này:

php artisan make:migration add_paid_to_users --table="users"

Điều này sẽ tự động thêm nội dung updownphương thức:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

Tương tự như vậy, bạn có thể sử dụng --create["table_name"]tùy chọn khi tạo các lần di chuyển mới, điều này sẽ thêm nhiều bản tóm tắt hơn cho các lần di chuyển của bạn. Điểm nhỏ, nhưng hữu ích khi làm vô số chúng!


2
Đó không phải là trường hợp trong Laravel 5.0, Blueprintđã được thêm vào trong Laravel 5.1. Chỉ cần một điểm làm rõ là tất cả.
Phill Sparks

@PhillSparks Bạn nói đúng, cảm ơn bạn đã bắt lỗi của tôi. Tôi đã cập nhật để làm rõ phiên bản có thể sử dụng phiên bản này.
camelCase

24

Nếu bạn đang sử dụng Laravel 5, lệnh sẽ là;

php artisan make:migration add_paid_to_users

Tất cả các lệnh để tạo ra mọi thứ (bộ điều khiển, mô hình, di chuyển, v.v.) đã được di chuyển theo make:lệnh.

php artisan migrate mặc dù vậy vẫn giống nhau


24

laravel 5.6 trở lên

trong trường hợp bạn muốn thêm cột mới dưới dạng phím NGOẠI TỆ vào bảng hiện có.

Tạo một di chuyển mới bằng cách thực hiện lệnh này: make: di chuyển

Thí dụ :

php artisan make:migration add_store_id_to_users_table --table=users

Trong thư mục cơ sở dữ liệu / di chuyển, bạn có tệp di chuyển mới, đại loại như:

2018_08_08_093431_add_store_id_to_users_table.php (xem các bình luận)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

Sau đó chạy lệnh:

php artisan migrate

Trong trường hợp bạn muốn hoàn tác việc di chuyển cuối cùng vì bất kỳ lý do gì, hãy chạy lệnh này:

php artisan migrate:rollback

Bạn có thể tìm thêm thông tin về di chuyển trong các tài liệu


1
Câu trả lời rất toàn diện và có liên quan. Cảm ơn!
musicin3d

17

Bạn có thể thêm các cột mới trong Schema::createphương thức ban đầu như thế này:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Nếu bạn đã tạo một bảng, bạn có thể thêm các cột bổ sung vào bảng đó bằng cách tạo một di chuyển mới và sử dụng Schema::tablephương thức:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Tài liệu này khá kỹ lưỡng về vấn đề này và đã không thay đổi quá nhiều từ phiên bản 3 sang phiên bản 4 .


Có gì đó không đúng ở đây. Tôi tạo "db: make" để tạo tệp di chuyển mới. Và sau đó tôi đặt Schema :: bảng ('users', function ($ table) {$ table-> số nguyên ('trả');}); vào nó Và chạy "php nghệ nhân di cư", nhưng nhận Fatal error: Can Người dùng lớp không redeclare trong /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php trên dòng 3
kim Larsen

Bạn nên đặt tên cho mỗi lần di chuyển một cái gì đó độc đáo khi tạo chúng. Thông thường, tạo ban đầu tôi sẽ đặt tên create_users_table, sau đó nếu tôi thêm các cột : add_email_password_columns_to_users.
tplaner

yeah như evolve nói, chắc chắn sẽ tốt hơn nếu gắn bó với các triết lý thiết kế laravel ban đầu và chỉ sử dụng add_động từ "" ở phía trước mỗi tệp để theo dõi các thay đổi. bằng cách này, việc theo dõi các thay đổi để kiểm soát phiên bản sẽ dễ dàng hơn vì một tệp thêm mới được tạo cho mỗi lần lặp. Nếu bạn vừa đi và tiếp tục sửa đổi " create_", thật khó để biết rằng nhân viên x, đã làm hỏng một cái gì đó bằng cách xóa chỉ mục hoặc thêm một cột mới, v.v. ít nhất điều đó có ý nghĩa trong đầu tôi! :)
dây00

7

bạn chỉ có thể sửa đổi tệp di chuyển hiện tại của mình, ví dụ: thêm một cột trong bảng của bạn và sau đó nhập kiểu đầu cuối:

$ php artisan migrate:refresh

11
Làm mới sẽ làm trống bàn
JohnTaa

8
Điều này cực kỳ nguy hiểm - nếu một số người chạy phiên bản cũ, một số người sẽ có phiên bản mới và sự hỗn loạn sẽ xảy ra. Trong Liquibase, nếu bạn chỉnh sửa một tệp, nó sẽ thất bại trừ khi bạn đặt ngoại lệ một cách rõ ràng để cho phép nó và bạn chỉ có thể làm điều này trong một vài trường hợp. Ví dụ: nếu bạn tạo một cột không null khi một số cơ sở dữ liệu đã có dữ liệu null trong đó, nó sẽ bị hỏng.
John Little

3
Sẽ tốt hơn, nếu bạn chỉnh sửa câu trả lời của mình và đề cập rằng nó sẽ làm trống bảng của bạn, nó sẽ tốt hơn.
Abel

Lưu ý: Lệnh này sẽ xóa toàn bộ bảng cơ sở dữ liệu , nếu bạn muốn sử dụng nó, sau đó sao lưu cơ sở dữ liệu của bạn trước
Udhav Sarvaiya

5

những điều này được thực hiện trên laravel 5.1.

đầu tiên, trên thiết bị đầu cuối của bạn thực thi mã này

php artisan make:migration add_paid_to_users --table=users

sau đó vào thư mục dự án của bạn và mở rộng cơ sở dữ liệu thư mục - di chuyển và chỉnh sửa tệp add_paid_to_users.php, thêm mã này

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

sau đó quay trở lại thiết bị đầu cuối của bạn và thực hiện lệnh này

php artisan migrate

hy vọng điều này giúp đỡ.


5

Quay lại lần đầu di chuyển trước đó của bạn

php artisan migrate:rollback

Sau đó, bạn có thể sửa đổi tệp di chuyển hiện tại của mình (thêm cột mới, đổi tên hoặc xóa cột) sau đó Chạy lại tệp di chuyển của bạn

php artisan migrate

0

Mặc dù một tệp di chuyển là cách thực hành tốt nhất như những người khác đã đề cập, trong một nhúm bạn cũng có thể thêm một cột bằng tinker.

$ php artisan tinker

Dưới đây là ví dụ một lớp lót cho thiết bị đầu cuối:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Ở đây nó được định dạng để dễ đọc)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
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.