Как я могу переименовать столбец в laravel с помощью миграции?


88

У меня есть столбцы, как указано ниже:

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 table

Теперь хочу переименовать idв id_stnk.
Я добавил "doctrine / dbal" в "composer" и сделал 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)

Ответы:


115

Вам нужно создать еще один файл миграции и поместить его туда:

Бегать

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таблицу.
Лоуренс

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

После создания файла. Откройте новый созданный файл миграции в папке вашего приложения в папке database / migrations.

В свой метод вставьте это:

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

чтобы отменить изменения. Удачи


я отредактировал свой вопрос выше, посмотрите сейчас .. у меня сообщение об ошибке в gitbash
Ariasa

1
Обязательно добавьте зависимость doctrine / 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 в построителе схемы. * Перед переименованием столбца обязательно добавьте зависимость doctrine / dbal в ваш файл composer.json. *

Или вы можете просто запросить пакет с помощью composer ...

composer require doctrine/dbal

Источник: https://laravel.com/docs/5.0/schema#renaming-columns

Примечание. Используйте make: migration, а не migrate: make для Laravel 5.x.


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

@mikoop Изначально это была зависимость от более ранних версий фреймворка. Но эта зависимость слишком велика и обычно не используется. Итак, он был удален. (Это краткое изложение; перед принятием решения было много обсуждений. Фактически, сообщество попросило его удалить, и оно было услышано.)
J. Bruni

renameColumn устарела в doctrine и в настоящее время удалена.
Сандер Виссер

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

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