Ajouter une nouvelle colonne à une table existante dans une migration


270

Je ne peux pas comprendre comment ajouter une nouvelle colonne à ma table de base de données existante en utilisant le framework Laravel.

J'ai essayé de modifier le fichier de migration à l'aide de ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

Dans le terminal, j'exécute php artisan migrate:installet migrate.

Comment ajouter de nouvelles colonnes?


Il serait utile d'inclure les erreurs que vous obtenez; qu'attendez-vous qu'il se passe; et que se passe-t-il réellement?
Phill Sparks

9
Grande question. Il y a beaucoup de documentation sur la migration, et elle vous montre l'API et comment créer des tables pour la PREMIÈRE FOIS. Ensuite, tout échoue lorsque vous développez davantage votre application et devez modifier votre structure de base de données.
Andrew Koper

Réponses:


612

Pour créer une migration, vous pouvez utiliser la commande migrate: make sur la CLI Artisan. Utilisez un nom spécifique pour éviter les conflits avec les modèles existants

pour Laravel 3:

php artisan migrate:make add_paid_to_users

pour Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Vous devez ensuite utiliser la Schema::table()méthode (lorsque vous accédez à une table existante et non en créez une nouvelle). Et vous pouvez ajouter une colonne comme celle-ci:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

et n'oubliez pas d'ajouter l'option de restauration:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('paid');
    });
}

Ensuite, vous pouvez exécuter vos migrations:

php artisan migrate

Tout cela est bien couvert dans la documentation de Laravel 3:

Et pour Laravel 4 / Laravel 5:

Éditer:

utilisez $table->integer('paid')->after('whichever_column');pour ajouter ce champ après une colonne spécifique.


3
Justphp artisan migrate
Phill Sparks

Quelque chose ne va pas. Je fais "db: make" pour créer un nouveau fichier de migration. Et puis je mets le Schema :: table ('utilisateurs', fonction ($ table) {$ table-> entier ('payé');}); dans ça. Et exécutez "php artisan migrate", mais obtenez une erreur fatale: impossible de redéclarer les utilisateurs de la classe dans /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php sur la ligne 3
kim larsen

La création de migrations est également traitée dans la documentation. Vous devez lui donner un nom plus spécifique, comme "add_paid_to_users", de cette façon, il ne se heurtera pas à votre collision de modèles.
Phill Sparks

Il semble que toute URL de document Laravel 3 redirige vers les documents Laravel 4. Voici les liens vers le 3 doc pour le générateur de schéma et les migrations

6
Depuis Laravel 5, cette commande serait désormaisphp artisan make:migration add_paid_to_users
mikelovelyuk

64

Je vais ajouter à la réponse de mike3875 pour les futurs lecteurs utilisant Laravel 5.1 et versions ultérieures.

Pour accélérer les choses, vous pouvez utiliser le drapeau "--table" comme ceci:

php artisan make:migration add_paid_to_users --table="users"

Cela ajoutera automatiquement le contenu de la méthode upet down:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

De même, vous pouvez utiliser l' --create["table_name"]option lors de la création de nouvelles migrations qui ajouteront plus de passe-partout à vos migrations. Petit point, mais utile pour en faire plein!


2
Ce n'était pas le cas dans Laravel 5.0, a Blueprintété ajouté dans Laravel 5.1. Un simple éclaircissement suffit.
Phill Sparks

@PhillSparks Vous avez raison, merci d'avoir rattrapé mon erreur. J'ai mis à jour pour clarifier la version dans laquelle cela peut être utilisé.
camelCase

24

Si vous utilisez Laravel 5, la commande serait;

php artisan make:migration add_paid_to_users

Toutes les commandes de création (contrôleurs, modèles, migrations, etc.) ont été déplacées sous la make:commande.

php artisan migrate est toujours le même.


24

laravel 5.6 et supérieur

dans le cas où vous souhaitez ajouter une nouvelle colonne en tant que CLÉ ÉTRANGÈRE à une table existante.

Créez une nouvelle migration en exécutant cette commande: make: migration

Exemple :

php artisan make:migration add_store_id_to_users_table --table=users

Dans le dossier base de données / migrations, vous avez un nouveau fichier de migration, quelque chose comme:

2018_08_08_093431_add_store_id_to_users_table.php (voir les commentaires)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

Après cela, exécutez la commande:

php artisan migrate

Si vous souhaitez annuler la dernière migration pour une raison quelconque, exécutez cette commande:

php artisan migrate:rollback

Vous pouvez trouver plus d'informations sur les migrations dans la documentation


1
Réponse très complète et pertinente. Merci!
musicin3d

17

Vous pouvez ajouter de nouvelles colonnes dans la Schema::createméthode initiale comme ceci:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Si vous avez déjà créé une table, vous pouvez ajouter des colonnes supplémentaires à cette table en créant une nouvelle migration et en utilisant la Schema::tableméthode:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

La documentation est assez complète à ce sujet et n'a pas trop changé de la version 3 à la version 4 .


Quelque chose ne va pas. Je fais "db: make" pour créer un nouveau fichier de migration. Et puis je mets le Schema :: table ('utilisateurs', fonction ($ table) {$ table-> entier ('payé');}); dans ça. Et exécutez «php artisan migrate», mais obtenez une erreur fatale: impossible de redéclarer les utilisateurs de la classe dans /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php sur la ligne 3
kim larsen

Vous devez nommer chacune des migrations quelque chose d'unique lors de leur création. En général , la première que je vais créer nommer create_users_table, alors si je suis d' ajouter des colonnes: add_email_password_columns_to_users.
tplaner

Oui, comme évolue, il est sûrement préférable de s'en tenir aux philosophies originales de conception de laravel et d'utiliser uniquement le add_verbe " " à l'avant de chaque fichier pour suivre les changements. de cette façon, il est plus facile de suivre les modifications pour le contrôle de version, etc. car un nouveau fichier d'ajout est créé pour chaque itération. Si vous venez de modifier le " create_", il serait difficile de savoir que l'employé x a foiré quelque chose en supprimant un index ou en ajoutant une nouvelle colonne, etc., au moins cela a du sens dans ma tête! :)
wired00

7

vous pouvez simplement modifier votre fichier de migration existant, par exemple en ajoutant une colonne dans votre tableau, puis dans votre terminal en tapant:

$ php artisan migrate:refresh

11
L'actualisation videra la table
JohnTaa

8
C'est incroyablement dangereux - si certaines personnes utilisent l'ancienne version, d'autres auront la nouvelle et le chaos s'ensuivra. Dans Liquibase, si vous modifiez un fichier, il échouera à moins que vous ne mettiez explicitement des exceptions pour le permettre, et vous ne pouvez le faire que dans très peu de cas. Par exemple, si vous rendez une colonne non nulle lorsque certaines bases de données contiennent déjà des données nulles, elle se cassera.
John Little

3
Ce serait mieux, si vous modifiez votre réponse et mentionnez que cela viderait votre tableau, ce serait mieux.
Abel

Remarque: Cette commande nettoiera des tables de bases de données entières , si vous voulez l'utiliser, puis sauvegardez d'abord votre base de données
Udhav Sarvaiya

5

ces choses sont travaillées sur laravel 5.1.

tout d'abord, sur votre terminal, exécutez ce code

php artisan make:migration add_paid_to_users --table=users

après cela, allez dans le répertoire de votre projet et développez la base de données du répertoire - migration et éditez le fichier add_paid_to_users.php, ajoutez ce code

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

après cela, revenez à votre terminal et exécutez cette commande

php artisan migrate

j'espère que cette aide.


5

Tout d'abord annuler votre migration précédente

php artisan migrate:rollback

Après cela, vous pouvez modifier votre fichier de migration existant (ajouter de nouvelles colonnes, renommer ou supprimer), puis réexécuter votre fichier de migration

php artisan migrate

0

Bien qu'un fichier de migration soit la meilleure pratique, comme d'autres l'ont mentionné, vous pouvez également ajouter une colonne avec bricoleur.

$ php artisan tinker

Voici un exemple de doublure pour le terminal:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Ici, il est formaté pour plus de lisibilité)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.