web-dev-qa-db-fra.com

laravel migration réorganiser l'ordre des colonnes

Lorsque vous créez une nouvelle colonne dans un tableau, vous pouvez utiliser le -> après ("nom de colonne") pour dicter où il va. Comment puis-je créer une migration qui réordonne les colonnes dans le bon ordre que je veux?

33
user391986

Essayez ceci, j'espère que cela vous aidera à trouver la bonne solution:

public function up()
{

    DB::statement("ALTER TABLE example MODIFY COLUMN foo DATE AFTER bar");

}

public function down()
{

    DB::statement("ALTER TABLE example MODIFY COLUMN foo DATE AFTER bar");

}
22
Odin Thunder

Si vous souhaitez le faire sans détruire les données, vous pouvez migrer les données en même temps que vous effectuez la mise à jour du schéma:

use DB;

public function up()
{
    //Give the moving column a temporary name:
    Schema::table('users', function($table)
    {
        $table->renameColumn('name', 'name_old');
    });

    //Add a new column with the regular name:
    Schema::table('users', function(Blueprint $table)
    {
        $table->string('name')->after('city');
    });

    //Copy the data across to the new column:
    DB::table('users')->update([
        'name' => DB::raw('name_old')   
    ]);

    //Remove the old column:
    Schema::table('users', function(Blueprint $table)
    {
        $table->dropColumn('name_old');
    });
}
19
Robert

Je suggérerais une requête DB :: ('.. requête SQL brute ..'); et utilisez la requête de la réponse " Comment déplacer des colonnes dans une table MySQL? "

6
Rob Gordijn

Supposons que le nom de votre colonne soit address et que vous souhaitiez réorganiser sa position afin qu'elle vienne après une autre colonne appelée city, et que le nom de votre table soit employees.

Dans votre terminal, tapez la commande suivante:

php artisan migrate:make reorganize_order_of_column_address --table=employees

Vous ne pouvez modifier que reorganize_order_of_column_address Et employees selon vos besoins, mais conservez le reste de la commande tel quel.

Cela va générer un fichier de migration dans le dossier app/database/migrations, L'ouvrir et placer votre code dans la fonction up() comme ceci:

public function up()
{
    Schema::table('employees', function(Blueprint $table)
    {
        $table->dropColumn("address");
    });

    Schema::table('employees', function(Blueprint $table)
    {
        $table->string('address')->after("city");
    });
}

Notez que cette méthode supprimera la colonne et toutes les données qui y étaient stockées, et créera une nouvelle colonne avec le même nom après la colonne que vous détectez, et la nouvelle créée sera vide.

Cela a fonctionné pour moi dans Laravel 4.2, et cela peut également fonctionner dans Laravel 5 mais avec quelques modifications dans les commandes que vous devez taper dans le terminal .

2
Amr