Comment puis-je renommer une colonne dans laravel en utilisant la migration?

88

J'ai des colonnes comme mentionné ci-dessous:

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

}

J'ai fait semoir à table stnk

Maintenant, je veux renommer iden id_stnk.
J'ai ajouté un "doctrine / dbal" dans le "composer" et fais un composer update.

J'ai fait la migration php artisan migration:make rename_column.
Ensuite, j'ai ajouté une nouvelle méthode à rename_column:

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

});

Et puis j'ai essayé d'exécuter la commande php artisan migratemais j'ai eu une erreur comme mentionné ci-dessous:

[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)
Ariasa
la source

Réponses:

115

Vous devez créer un autre fichier de migration - et le placer là-dedans:

Courir

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

Puis à l'intérieur du nouveau fichier de migration:

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

}
Laurence
la source
J'ai édité ma question ci-dessus, regardez maintenant .. j'ai un message d'erreur dans gitbash
Ariasa
L'erreur 150 est une restriction de clé étrangère. Cela signifie que vous avez d'autres tables qui référencent le idsur la stnktable.
Laurence
3
Note pour Laravel 5 c'est maintenant make:migrationet nonmigrate:make
Jason
8
De plus, pour que le changement de nom de colonne fonctionne, vous devez exiger un package qui a été supprimé dans L5 "doctrine/dbal": "~2.3"sans que vous obteniez des erreurs très obscures. Il a été soulevé comme un bogue ici github.com/laravel/framework/issues/3116 et avec une mention sans doute moins utile dans la documentation ici laravel.com/docs/5.0/schema#renaming-columns
Jason
Une fois la migration terminée, le fichier doit-il être supprimé et le schéma de création d'origine mis à jour? Il suffit de demander comment garder les choses propres
orbite le
27

La première chose à faire est de créer votre fichier de migration.

Tapez votre ligne de commande

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

Après avoir créé le fichier. Ouvrez le nouveau fichier de migration créé dans votre dossier d'application sous base de données / migrations.

Dans votre méthode up, insérez ceci:

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

et dans votre méthode down:

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

puis dans votre ligne de commande tapez simplement

php artisan migrate

Alors wollah! vous venez de renommer id en id_stnk. BTW, vous pouvez utiliser

php artisan migrate:rollback

pour annuler les modifications. Bonne chance

webartisan
la source
j'ai eddit ma question ci-dessus, regardez maintenant .. j'ai un message d'erreur dans gitbash
Ariasa
1
Assurez-vous d'ajouter la dépendance doctrine / dbal à votre fichier composer.json.
Ben
16

Suivez ces étapes, respectivement pour renommer le fichier de migration de colonne.

1- Existe-t-il une bibliothèque Doctrine / dbal dans votre projet. Si vous n'avez pas exécuté la commande en premier

composer require doctrine/dbal

2- créer un fichier de migration de mise à jour pour mettre à jour l'ancien fichier de migration. Attention (besoin d'avoir le même nom)

php artisan make:migration update_oldFileName_table

par exemple mon ancien nom de fichier de migration: create_users_table le nom du fichier de mise à jour doit: update_users_table

3- update_oldNameFile_table.php

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

'de' mon ancien nom de colonne et 'vers' mon nouveau nom de colonne

4- Enfin exécutez la commande migrate

php artisan migrate

Lien source: document laravel

Melih Sahin
la source
14

Renommer les colonnes (Laravel 5.x)

Pour renommer une colonne, vous pouvez utiliser la méthode renameColumn sur le générateur de schéma. * Avant de renommer une colonne, assurez-vous d'ajouter la dépendance doctrine / dbal à votre fichier composer.json. *

Ou vous pouvez simplement avoir besoin du package en utilisant composer ...

composer require doctrine/dbal

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

Remarque: utilisez make: migration et non migrate: make pour Laravel 5.x

bmatovu
la source
N'utilisez simplement aucune colonne comme ENUM dans la table que vous essayez de modifier. Doctrine / dbal ne sait pas ce que c'est ..... J'ai dû changer la migration d'origine pour qu'elle soit le nom correct au début et réinitialiser toute la base de données. Heureusement, j'étais encore en développement. Est-ce que je dirais que Laravel & Co en ferait une dépendance au compositeur dès le départ?
mikoop
@mikoop C'était à l'origine une dépendance depuis le début, dans les versions antérieures du framework. Mais cette dépendance est trop lourde et peu utilisée. Donc, il a été supprimé. (Ceci est le résumé; il y a eu beaucoup de discussions avant la décision. En fait, la communauté a demandé son retrait et a été entendue.)
J. Bruni
renameColumn était obsolète dans doctrine, et actuellement supprimé.
Sander Visser
9

Jeter mon 0,02 $ ici car aucune des réponses n'a fonctionné, mais m'a envoyé sur le bon chemin. Ce qui s'est passé, c'est qu'une contrainte étrangère précédente lançait l'erreur. Évident quand on y pense.

Ainsi, dans la upméthode de votre nouvelle migration , supprimez d'abord cette contrainte d'origine, renommez la colonne, puis ajoutez à nouveau la contrainte avec le nouveau nom de colonne. Dans la downméthode, vous faites exactement le contraire pour revenir au paramètre vendu.

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

J'espère que cela fera gagner du temps à quelqu'un dans le futur!

Stan Smulders
la source
1

La réponse ci-dessus est excellente ou si cela ne vous fera pas de mal, annulez simplement la migration, modifiez le nom et réexécutez la migration.

 php artisan migrate:rollback
geai temp
la source
J'ai édité ma question ci-dessus, regardez maintenant .. j'ai un message d'erreur dans gitbash
Ariasa