Bagaimana cara mengganti nama kolom di laravel menggunakan migrasi?


92

Saya memiliki kolom seperti yang disebutkan di bawah ini:

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');
    });

}

Saya telah membuat seeder ke tabel stnk

Sekarang saya ingin mengganti nama idmenjadi id_stnk.
Saya telah menambahkan "doktrin / dbal" di "komposer" dan melakukan a composer update.

Saya telah melakukan migrasi php artisan migration:make rename_column.
Kemudian saya telah menambahkan metode baru untuk mengganti nama_kolom:

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

});

Dan kemudian saya sudah mencoba menjalankan perintah php artisan migratetetapi saya mendapat kesalahan seperti yang disebutkan di bawah ini:

[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)

Jawaban:


120

Anda perlu membuat file migrasi lain - dan meletakkannya di sana:

Lari

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

Kemudian di dalam tempat file migrasi baru:

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');
        });
    }

}

saya telah mengedit pertanyaan saya di atas, lihat sekarang .. saya memiliki pesan kesalahan di gitbash
Ariasa

Kesalahan 150 adalah penahan kunci asing. Ini berarti Anda memiliki tabel lain yang referensi idpada stnktabel.
Laurence

3
Catatan untuk Laravel 5 sekarang make:migrationdan bukanmigrate:make
Jason

9
Juga untuk mengganti nama kolom untuk bekerja, Anda perlu memerlukan paket yang telah dihapus di L5 "doctrine/dbal": "~2.3"Tanpa itu Anda mendapatkan beberapa kesalahan yang sangat tidak jelas. Itu dibesarkan sebagai bug di sini github.com/laravel/framework/issues/3116 dan dengan sebutan yang kurang berguna dalam dokumentasi di sini laravel.com/docs/5.0/schema#renaming-columns
Jason

Setelah migrasi selesai, apakah file harus dihapus dan skema pembuatan asli diperbarui? Hanya menanyakan cara menjaga kebersihan
orbit

30

hal pertama yang ingin Anda lakukan adalah membuat file migrasi Anda.

Ketik baris perintah Anda

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

Setelah membuat file. Buka file migrasi baru yang dibuat di folder aplikasi Anda di bawah database / migrasi.

Dalam metode up Anda, masukkan ini:

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

dan metode down Anda:

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

lalu di baris perintah Anda cukup ketik

php artisan migrate

Lalu wollah! Anda baru saja mengganti nama id menjadi id_stnk. BTW bisa Anda gunakan

php artisan migrate:rollback

untuk membatalkan perubahan. Semoga berhasil


saya telah mengedit pertanyaan saya di atas, lihat sekarang .. saya memiliki pesan kesalahan di gitbash
Ariasa

1
Pastikan untuk menambahkan ketergantungan doktrin / dbal ke file composer.json Anda.
Ben

19

Ikuti langkah-langkah ini, masing-masing untuk mengganti nama file migrasi kolom.

1- Apakah ada perpustakaan Doktrin / dbal dalam proyek Anda. Jika Anda belum menjalankan perintah terlebih dahulu

composer require doctrine/dbal

2- buat pembaruan file migrasi untuk memperbarui file migrasi lama. Peringatan (harus memiliki nama yang sama)

php artisan make:migration update_oldFileName_table

misalnya nama file migrasi lama saya: create_users_table memperbarui nama file harus: update_users_table

3- update_oldNameFile_table.php

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

'dari' nama kolom lama saya dan 'ke' nama kolom baru saya

4- Terakhir jalankan perintah migrasi

php artisan migrate

Link sumber: dokumen laravel


14

Mengganti Nama Kolom (Laravel 5.x)

Untuk mengganti nama kolom, Anda dapat menggunakan metode renameColumn di pembuat Skema. * Sebelum mengganti nama kolom, pastikan untuk menambahkan ketergantungan doktrin / dbal ke file composer.json Anda. *

Atau Anda dapat meminta paket menggunakan komposer ...

composer require doctrine/dbal

Sumber: https://laravel.com/docs/5.0/schema#renaming-columns

Catatan: Gunakan make: migrasi dan bukan migrasi: make untuk Laravel 5.x


Hanya saja, jangan gunakan kolom apa pun sebagai ENUM dalam tabel yang Anda coba edit. Doctrine / dbal tidak tahu apa ini ..... Saya harus mengubah migrasi asli menjadi nama yang benar di awal dan mengatur ulang seluruh database. Beruntung saya masih dalam pengembangan. Akankah saya berpikir Laravel & Co akan menjadikan ini ketergantungan pada komposer sejak awal?
mikoop

@mikoop Itu aslinya adalah ketergantungan sejak awal, di versi kerangka kerja sebelumnya. Tetapi ketergantungan ini terlalu berat dan tidak umum digunakan. Jadi sudah dihapus. (Ini ringkasannya, banyak diskusi sebelum keputusan. Bahkan, masyarakat sudah meminta untuk dicopot, dan sudah didengar.)
J. Bruni

renameColumn tidak digunakan lagi dalam doktrin, dan saat ini dihapus.
Sander Visser

10

Melemparkan $ 0,02 saya ke sini karena tidak ada jawaban yang berhasil, tetapi mengirim saya ke jalur yang benar. Apa yang terjadi adalah kendala asing sebelumnya yang menyebabkan kesalahan. Jelas ketika Anda memikirkannya.

Jadi dalam upmetode migrasi baru Anda , pertama-tama jatuhkan batasan asli tersebut, ganti nama kolomnya, lalu tambahkan batasan lagi dengan nama kolom baru. Dalam downmetode ini, Anda melakukan kebalikannya sehingga kembali ke pengaturan yang dijual.

/**
 * 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');
    });
}

Semoga ini menghemat waktu seseorang di masa depan!


1

Jawaban di atas bagus atau jika tidak akan merugikan Anda, cukup kembalikan migrasi dan ubah nama dan jalankan migrasi lagi.

 php artisan migrate:rollback

saya telah mengedit pertanyaan saya di atas, lihat sekarang .. saya memiliki pesan kesalahan di gitbash
Ariasa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.