ฉันจะเปลี่ยนชื่อคอลัมน์ใน laravel โดยใช้การย้ายข้อมูลได้อย่างไร


92

ฉันมีคอลัมน์ดังที่กล่าวถึงร้อง:

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

}

ฉันได้สร้าง seeder เป็น stnk table แล้ว

ตอนนี้ผมต้องการที่จะเปลี่ยนชื่อไปid ฉันได้เพิ่ม"คำสอน / dbal"ใน"นักแต่งเพลง"และทำก.id_stnk
composer update

ฉันได้ทำการย้ายข้อมูลphp artisan migration:make rename_columnแล้ว
จากนั้นฉันได้เพิ่มวิธีการใหม่ในการเปลี่ยนชื่อคอลัมน์:

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

});

จากนั้นฉันพยายามเรียกใช้คำสั่งphp artisan migrateแต่ฉันพบข้อผิดพลาดดังที่กล่าวถึง:

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

คำตอบ:


120

คุณต้องสร้างไฟล์การย้ายข้อมูลอื่นและวางไว้ที่นั่น:

วิ่ง

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

จากนั้นภายในตำแหน่งไฟล์การย้ายข้อมูลใหม่:

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

}

ฉันได้แก้ไขคำถามของฉันด้านบนดูตอนนี้ .. ฉันมีข้อความแสดงข้อผิดพลาดใน gitbash
Ariasa

ข้อผิดพลาด 150 คือการยับยั้งคีย์ต่างประเทศ หมายความว่าคุณมีตารางอื่น ๆ ที่อ้างอิงidบนstnkโต๊ะ
Laurence

3
หมายเหตุสำหรับ Laravel 5 ตอนนี้make:migrationไม่ใช่แล้วmigrate:make
Jason

9
นอกจากนี้สำหรับการเปลี่ยนชื่อคอลัมน์ให้ใช้งานได้คุณจำเป็นต้องมีแพ็คเกจที่ถูกลบออกใน L5 "doctrine/dbal": "~2.3"โดยที่คุณไม่ได้รับข้อผิดพลาดที่คลุมเครือ มันถูกยกให้เป็นข้อบกพร่องที่นี่github.com/laravel/framework/issues/3116และมีการกล่าวถึงเนื้อหาที่มีประโยชน์น้อยกว่าในเอกสารที่นี่laravel.com/docs/5.0/schema#renaming-columns
Jason

เมื่อย้ายข้อมูลเสร็จแล้วควรลบไฟล์และอัปเดตสคีมาสร้างต้นฉบับหรือไม่ แค่ถามว่าจะรักษาความสะอาดได้อย่างไร
โคจร

31

สิ่งแรกที่คุณต้องทำคือสร้างไฟล์การย้ายข้อมูลของคุณ

พิมพ์บรรทัดคำสั่งของคุณ

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

หลังจากสร้างไฟล์. เปิดไฟล์การย้ายข้อมูลที่สร้างขึ้นใหม่ในโฟลเดอร์แอปของคุณภายใต้ฐานข้อมูล / การย้ายข้อมูล

ในวิธีการขึ้นของคุณให้แทรกสิ่งนี้:

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

และในวิธีการลงของคุณ:

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

จากนั้นในบรรทัดคำสั่งของคุณให้พิมพ์

php artisan migrate

แล้วโว้ย! คุณเพิ่งเปลี่ยนชื่อ id เป็น id_stnk BTW ที่คุณสามารถใช้ได้

php artisan migrate:rollback

เพื่อเลิกทำการเปลี่ยนแปลง โชคดี


ฉันได้แก้ไขคำถามของฉันด้านบนดูตอนนี้ .. ฉันมีข้อความแสดงข้อผิดพลาดใน gitbash
Ariasa

1
อย่าลืมเพิ่มการพึ่งพาหลักคำสอน / dbal ในไฟล์ composer.json ของคุณ
เบ็น

19

ทำตามขั้นตอนเหล่านี้ตามลำดับสำหรับการเปลี่ยนชื่อไฟล์การย้ายคอลัมน์

1-มีห้องสมุด Doctrine / dbal ในโครงการของคุณหรือไม่ หากคุณไม่ได้รันคำสั่งก่อน

composer require doctrine/dbal

2-สร้างไฟล์การย้ายการอัปเดตสำหรับอัปเดตไฟล์การย้ายข้อมูลเก่า คำเตือน (ต้องมีชื่อเดียวกัน)

php artisan make:migration update_oldFileName_table

ตัวอย่างเช่นชื่อไฟล์การย้ายข้อมูลเก่าของฉัน: ชื่อไฟล์อัพเดต create_users_table ควร: update_users_table

3- update_oldNameFile_table.php

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

'จาก' ชื่อคอลัมน์เก่าของฉันและ 'ถึง' ชื่อคอลัมน์ใหม่ของฉัน

4-สุดท้ายเรียกใช้คำสั่งโยกย้าย

php artisan migrate

ลิงค์ที่มา: laravel document


14

การเปลี่ยนชื่อคอลัมน์(Laravel 5.x)

ในการเปลี่ยนชื่อคอลัมน์คุณสามารถใช้เมธอด renameColumn บนตัวสร้างสคีมา * ก่อนเปลี่ยนชื่อคอลัมน์อย่าลืมเพิ่มการพึ่งพาหลักคำสอน / dbalในไฟล์ composer.json ของคุณ *

หรือคุณสามารถต้องการแพ็คเกจโดยใช้นักแต่งเพลง ...

composer require doctrine/dbal

ที่มา: https://laravel.com/docs/5.0/schema#renaming-columns

หมายเหตุ:ใช้make: migration and not migrate: make for Laravel 5.x


อย่าใช้คอลัมน์ใด ๆ เป็น ENUM ในตารางที่คุณพยายามแก้ไข Doctrine / dbal ไม่รู้ว่านี่คืออะไร ..... ฉันต้องเปลี่ยนการย้ายข้อมูลเดิมเป็นชื่อที่ถูกต้องเมื่อเริ่มต้นและรีเซ็ตฐานข้อมูลทั้งหมด โชคดีที่ฉันยังอยู่ระหว่างการพัฒนา ฉันคิดว่า Laravel & Co จะทำให้สิ่งนี้เป็นที่พึ่งพาในนักแต่งเพลงตั้งแต่เริ่มต้นหรือไม่?
mikoop

@mikoop เป็นแบบดั้งเดิมที่พึ่งพาตั้งแต่เริ่มต้นในเฟรมเวิร์กเวอร์ชันก่อนหน้า แต่การพึ่งพานี้หนักเกินไปและไม่นิยมใช้ เลยลบออกไปแล้ว (นี่คือบทสรุปมีการอภิปรายมากมายก่อนการตัดสินใจอันที่จริงชุมชนได้ขอให้นำออกและได้รับฟังแล้ว)
J. Bruni

renameColumn เลิกใช้แล้วในหลักคำสอนและปัจจุบันถูกลบออก
Sander Visser

10

โยนเงิน 0.02 ดอลลาร์ของฉันที่นี่เนื่องจากไม่มีคำตอบใดได้ผล แต่ส่งฉันไปถูกทาง สิ่งที่เกิดขึ้นคือข้อ จำกัด จากต่างประเทศก่อนหน้านี้ทำให้เกิดข้อผิดพลาด เห็นได้ชัดเมื่อคุณคิดถึงมัน

ดังนั้นในupวิธีการย้ายข้อมูลใหม่ของคุณอันดับแรกให้วางข้อ จำกัด เดิมเปลี่ยนชื่อคอลัมน์จากนั้นเพิ่มข้อ จำกัด อีกครั้งด้วยชื่อคอลัมน์ใหม่ ในdownวิธีนี้คุณทำตรงกันข้ามเพื่อให้กลับสู่การตั้งค่าที่ขายไปแล้ว

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

หวังว่านี่จะช่วยใครบางคนในอนาคต!


1

คำตอบข้างต้นดีมากหรือหากจะไม่ทำให้คุณเสียหายเพียงแค่ย้อนกลับการย้ายข้อมูลและเปลี่ยนชื่อและเรียกใช้การย้ายข้อมูลอีกครั้ง

 php artisan migrate:rollback

ฉันได้แก้ไขคำถามของฉันด้านบนดูตอนนี้ .. ฉันมีข้อความแสดงข้อผิดพลาดใน gitbash
Ariasa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.