Як я можу перейменувати стовпець у laravel за допомогою міграції?


86

У мене є стовпці, як згадано нижче:

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

}

Я зробив сівалку до столу stnk

Тепер я хочу перейменувати idна id_stnk.
Я додав "вчення / dbal" у "композитор" і роблю a composer update.

Я здійснив міграцію php artisan migration:make rename_column.
Потім я додав новий метод до 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)

Відповіді:


113

Вам потрібно створити ще один файл міграції - і помістити його туди:

Біжи

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

}

У мене є eddit моє запитання вище, подивіться зараз .. у мене є повідомлення про помилку в gitbash
Ariasa

Помилка 150 є обмеженням зовнішнього ключа. Це означає, що у вас є інші таблиці, які посилаються idна stnkтаблицю.
Лоуренс,

3
Примітка для Laravel 5 це зараз, make:migrationа ніmigrate:make
Джейсон,

8
Також для того, щоб перейменування стовпців працювало, вам потрібно вимагати пакет, який було видалено в L5. "doctrine/dbal": "~2.3"Без цього ви отримуєте дуже незрозумілі помилки. Це було порушено як помилку тут github.com/laravel/framework/issues/3116 і з, можливо, менш корисним згадуванням у документації тут laravel.com/docs/5.0/schema#renaming-columns
Джейсон

Після завершення міграції файл слід видалити та оновити оригінальну схему створення? Просто запитую, як підтримувати чистоту
орбітальний

27

Перше, що ви хочете зробити, це створити файл міграції.

Введіть свій командний рядок

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. До речі, ви можете використовувати

php artisan migrate:rollback

скасувати зміни. Удачі


У мене є eddit моє запитання вище, подивіться зараз .. у мене є повідомлення про помилку в gitbash
Ariasa

1
Не забудьте додати залежність доктрини / dbal до вашого файлу composer.json.
Бен,

16

Виконайте ці кроки, відповідно, для перейменування файлу перенесення стовпця.

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- Нарешті запустіть команду migrate

php artisan migrate

Посилання на джерело: документ laravel


14

Перейменування стовпців (Laravel 5.x)

Щоб перейменувати стовпець, ви можете використовувати метод renameColumn у конструкторі схем. * Перш ніж перейменовувати стовпець, не забудьте додати залежність доктрини / dbal до вашого файлу composer.json. *

Або ви можете просто вимагати пакет за допомогою композитора ...

composer require doctrine/dbal

Джерело: https://laravel.com/docs/5.0/schema#renaming-columns

Примітка: Використовуйте make: migration і not migrate: make для Laravel 5.x


Просто не використовуйте жодних стовпців як ENUM у таблиці, яку ви намагаєтеся редагувати. Doctrine / dbal не знає, що це таке ..... Мені довелося змінити оригінальну міграцію, щоб на початку було правильним ім'ям, і скинути цілу базу даних. Пощастило, я ще був у розробці. Я хотів би, хоча Laravel & Co з самого початку зробив би це залежністю від композитора?
mikoop

@mikoop Це спочатку було залежністю від самого початку, у попередніх версіях фреймворку. Але ця залежність занадто важка і не є загальновживаною. Отже, його було видалено. (Це короткий зміст; до рішення було багато обговорень. Насправді, громада просила про його вилучення і була заслухана.)
Дж. Бруні

renameColumn застаріло в доктрині та наразі видалено.
Сандер Віссер,

9

Кинувши сюди свої 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

У мене є eddit моє запитання вище, подивіться зараз .. у мене є повідомлення про помилку в gitbash
Ariasa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.