Як я можу перейменувати стовпець у 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.