Làm cách nào để đổi tên cột trong laravel bằng cách sử dụng chuyển đổi?


88

Tôi có các cột như đã đề cập bên dưới:

public function up()
{
    Schema::create('stnk', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('no_reg', 50)->unique();
        $table->string('no_bpkb', 50)->unique();
        $table->string('nama_pemilik', 100);
        $table->string('alamat');
        $table->string('merk', 50);
        $table->string('tipe', 50);
        $table->string('jenis', 50);
        $table->smallInteger('tahun_pembuatan');
        $table->smallInteger('tahun_registrasi');
        $table->smallInteger('isi_silinder');
        $table->string('no_rangka', 50);
        $table->string('no_mesin', 50);
        $table->string('warna', 50);
        $table->string('bahan_bakar', 50);
        $table->string('warna_tnkb', 50);
        $table->string('kode_lokasi', 50);
        $table->date('berlaku_sampai');
        $table->timestamps();

        $table->index('created_at');
        $table->index('updated_at');
    });

}

Tôi đã làm seeder để stnk table

Bây giờ tôi muốn đổi tên idthành id_stnk.
Tôi đã thêm một "học thuyết / dbal" trong "nhà soạn nhạc" và thực hiện một composer update.

Tôi đã di chuyển php artisan migration:make rename_column.
Sau đó, tôi đã thêm phương thức mới vào rename_column:

Schema::table('stnk', function(Blueprint $table)
{
    $table->renameColumn('id', 'id_stnk');

});

Và sau đó tôi đã cố gắng chạy lệnh php artisan migratenhưng tôi gặp lỗi như đã đề cập bên dưới:

[Ulluminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1025 Error on rename of './my_database/#sql -447_33' to './my_database/stnk' (error: 150) (SQL: ALTER TABLE stnk CHANGE id id_stnk INT UNSIGENED AUTO_INCREMENT NOT NULL)

[PDOException]
SQLSTATE[HY000]: General error: 1025  Error on rename  of './my_database/#sql -447_33' to './my_database/stnk' (error: 150)

Câu trả lời:


115

Bạn cần tạo một tệp di chuyển khác - và đặt nó vào đó:

Chạy

Laravel 4:    php artisan migrate:make rename_stnk_column
Laravel 5:    php artisan make:migration rename_stnk_column

Sau đó, bên trong tệp di chuyển mới đặt:

class RenameStnkColumn extends Migration
{

    public function up()
    {
        Schema::table('stnk', function(Blueprint $table) {
            $table->renameColumn('id', 'id_stnk');
        });
    }


    public function down()
    {
        Schema::table('stnk', function(Blueprint $table) {
            $table->renameColumn('id_stnk', 'id');
        });
    }

}

Tôi đã chỉnh sửa câu hỏi của mình ở trên, hãy xem bây giờ .. tôi có thông báo lỗi trong gitbash
Ariasa

Lỗi 150 là hạn chế khóa ngoại. Nó có nghĩa là bạn có các bảng khác tham chiếu idđến stnkbảng trên.
Laurence

3
Lưu ý cho Laravel 5 bây giờ nó là make:migrationvà khôngmigrate:make
Jason

9
Ngoài ra, để đổi tên cột hoạt động, bạn cần yêu cầu một gói đã được loại bỏ trong L5 "doctrine/dbal": "~2.3"Nếu không, bạn sẽ gặp một số lỗi rất khó hiểu. Nó đã được nêu ra như một lỗi tại đây github.com/laravel/framework/issues/3116 và với một đề cập được cho là ít hữu ích hơn trong tài liệu ở đây laravel.com/docs/5.0/schema#renaming-columns
Jason

Khi quá trình di chuyển hoàn tất, tệp có nên bị xóa và cập nhật lược đồ tạo ban đầu không? Chỉ hỏi làm thế nào để giữ mọi thứ sạch sẽ
quỹ đạo

27

điều đầu tiên bạn muốn làm là tạo tệp di chuyển của mình.

Nhập dòng lệnh của bạn

php artisan make:migration rename_stk_column --table="YOUR TABLE" --create

Sau khi tạo tệp. Mở tệp di chuyển được tạo mới trong thư mục ứng dụng của bạn trong cơ sở dữ liệu / di chuyển.

Trong phương pháp up của bạn, hãy chèn cái này:

Schema::table('stnk', function(Blueprint $table)
    {
        $table->renameColumn('id', 'id_stnk');
    });
}

và trong phương pháp xuống của bạn:

    Schema::table('stnk', function(Blueprint $table)
    {
        $table->renameColumn('id_stnk', 'id);
    });
}

sau đó trong dòng lệnh của bạn chỉ cần nhập

php artisan migrate

Vậy thì wollah! bạn vừa đổi tên id thành id_stnk. BTW bạn có thể sử dụng

php artisan migrate:rollback

để hoàn tác các thay đổi. Chúc may mắn


Tôi đã chỉnh sửa câu hỏi của mình ở trên, hãy xem bây giờ .. tôi gặp thông báo lỗi trong gitbash
Ariasa

1
Đảm bảo thêm sự phụ thuộc của học thuyết / dbal vào tệp composer.json của bạn.
Ben

17

Thực hiện theo các bước sau, tương ứng để đổi tên tệp di chuyển cột.

1- Có thư viện Doctrine / dbal trong dự án của bạn không. Nếu bạn chưa chạy lệnh trước

composer require doctrine/dbal

2- tạo tệp di chuyển cập nhật để cập nhật tệp di chuyển cũ. Cảnh báo (cần trùng tên)

php artisan make:migration update_oldFileName_table

ví dụ: tên tệp di chuyển cũ của tôi: create_users_table, tên tệp cập nhật nên: update_users_table

3- update_oldNameFile_table.php

Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});

'từ' tên cột cũ của tôi và 'thành' tên cột mới của tôi

4- Cuối cùng chạy lệnh di chuyển

php artisan migrate

Link nguồn: tài liệu laravel


14

Đổi tên các cột (Laravel 5.x)

Để đổi tên một cột, bạn có thể sử dụng phương thức renameColumn trên trình tạo lược đồ. * Trước khi đổi tên một cột, hãy đảm bảo thêm phụ thuộc học thuyết / dbal vào tệp composer.json của bạn. *

Hoặc bạn có thể chỉ cần yêu cầu gói bằng trình soạn nhạc ...

composer require doctrine/dbal

Nguồn: https://laravel.com/docs/5.0/schema#renaming-columns

Lưu ý: Sử dụng make : igration and not migrate: make cho Laravel 5.x


Chỉ cần không sử dụng bất kỳ cột nào làm ENUM trong bảng bạn đang cố gắng chỉnh sửa. Doctrine / dbal không biết đây là gì ..... Tôi đã phải thay đổi di chuyển ban đầu thành tên chính xác khi bắt đầu và đặt lại toàn bộ cơ sở dữ liệu. May mắn thay, tôi vẫn đang trong quá trình phát triển. Tôi có nghĩ rằng Laravel & Co sẽ biến điều này trở thành sự phụ thuộc vào nhà soạn nhạc ngay từ đầu không?
mikoop

@mikoop Nó có nguồn gốc là một sự phụ thuộc ngay từ đầu, trong các phiên bản trước của khuôn khổ. Nhưng sự phụ thuộc này quá nặng và không được sử dụng phổ biến. Vì vậy, nó đã bị loại bỏ. (Đây là bản tóm tắt; đã có rất nhiều cuộc thảo luận trước khi quyết định Trong thực tế, cộng đồng đã yêu cầu gỡ bỏ nó, và đã được nghe..)
J. Bruni

renameColumn không được chấp nhận trong học thuyết và hiện đã bị xóa.
Sander Visser

9

Ném 0,02 đô la của tôi vào đây vì không có câu trả lời nào hiệu quả, nhưng đã đưa tôi đi đúng đường. Điều đã xảy ra là một ràng buộc nước ngoài trước đó đã gây ra lỗi. Rõ ràng khi bạn nghĩ về nó.

Vì vậy, trong upphương thức di chuyển mới của bạn , trước tiên hãy bỏ ràng buộc ban đầu đó, đổi tên cột, sau đó thêm lại ràng buộc bằng tên cột mới. Trong downphương pháp này, bạn làm ngược lại hoàn toàn để nó trở lại cài đặt đã bán.

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('proxy4s', function (Blueprint $table) {
        // Drop it
        $table->dropForeign(['server_id']);

        // Rename
        $table->renameColumn('server_id', 'linux_server_id');

        // Add it
        $table->foreign('linux_server_id')->references('id')->on('linux_servers');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('proxy4s', function (Blueprint $table) {
        // Drop it
        $table->dropForeign(['linux_server_id']);

        // Rename
        $table->renameColumn('linux_server_id', 'server_id');

        // Add it
        $table->foreign('server_id')->references('id')->on('linux_servers');
    });
}

Hy vọng điều này sẽ giúp ai đó tiết kiệm thời gian trong tương lai!


1

Câu trả lời trên là tuyệt vời hoặc nếu nó sẽ không làm hại bạn, chỉ cần quay lại quá trình di chuyển và thay đổi tên và chạy lại quá trình di chuyển.

 php artisan migrate:rollback

Tôi đã chỉnh sửa câu hỏi của mình ở trên, xem bây giờ .. tôi có thông báo lỗi trong gitbash
Ariasa
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.