Migration de Laravel changer et rendre la colonne nullable

J’ai créé une migration avec user_id non signé. Comment puis-je éditer user_id dans une nouvelle parsing pour la rendre également nullable nullable() ?

  Schema::create('throttle', function(Blueprint $table) { $table->increments('id'); $table->integer('user_id')->unsigned(); // this needs to also be nullable, how should the next migration be? } 

    Laravel 5 prend désormais en charge le changement de colonne.

    Exemple de document officiel

     Schema::table('users', function($table) { $table->ssortingng('name', 50)->nullable()->change(); }); 

    source: http://laravel.com/docs/5.0/schema#changing-columns

    Laravel 4 ne prend pas en charge la modification de colonne. Vous devez écrire la commande sql brute.

      // getting Laravel App Instance $app = app(); // getting laravel main version $laravelVer = explode('.',$app::VERSION); switch ($laravelVer[0]) { case('5') : Schema::table('pro_categories_langs', function(Blueprint $t) { $t->ssortingng('name', 100)->nullable()->default(null)->change(); }); break; /** * it is not L5 !! */ default : DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;'); } 

    Je suppose que vous essayez d’éditer une colonne sur laquelle vous avez déjà ajouté des données, il est donc impossible de supprimer une colonne et de l’append à nouveau en tant que colonne nullable sans perte de données. Nous allons alter la colonne existante.

    Cependant, le constructeur de schéma de Laravel ne prend pas en charge la modification de colonnes autres que le changement de nom de la colonne. Vous devrez donc lancer des requêtes brutes pour les faire, comme ceci:

     function up() { DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;'); } 

    Et pour vous assurer que vous pouvez toujours annuler votre migration, nous ferons également le down() .

     function down() { DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'); } 

    Une note est que puisque vous convertissez entre nullable et non nullable, vous devrez vous assurer de nettoyer les données avant / après votre migration. Faites donc cela dans votre script de migration dans les deux sens:

     function up() { DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;'); DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;'); } function down() { DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;'); DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'); } 

    Voici la réponse complète pour le futur lecteur. Notez que cela n’est possible que dans Laravel 5+.

    Tout d’abord, vous aurez besoin du paquet docsortingne / dbal :

     composer require docsortingne/dbal 

    Maintenant, dans votre migration, vous pouvez le faire pour rendre la colonne nullable:

     public function up() { Schema::table('users', function (Blueprint $table) { // change() tells the Schema builder that we are altering a table $table->integer('user_id')->unsigned()->nullable()->change(); }); } 

    Vous vous demandez peut-être comment annuler cette opération. Malheureusement cette syntaxe n’est pas supscope:

     // Sadly does not work :'( $table->integer('user_id')->unsigned()->change(); 

    Ceci est la syntaxe correcte pour annuler la migration:

     $table->integer('user_id')->unsigned()->nullable(false)->change(); 

    Ou, si vous préférez, vous pouvez écrire une requête brute:

     public function down() { /* Make user_id un-nullable */ DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;'); DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'); } 

    J’espère que vous trouverez cette réponse utile. 🙂

    Il est la migration complète pour Laravel 5 :

     public function up() { Schema::table('users', function (Blueprint $table) { $table->unsignedInteger('user_id')->nullable()->change(); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->unsignedInteger('user_id')->nullable(false)->change(); }); } 

    Le fait est que vous pouvez supprimer nullable en transmettant false comme argument.

    Si vous changez les colonnes et que vous êtes tombé sur

     'Docsortingne\DBAL\Driver\PDOMySql\Driver' not found 

    puis installez simplement

    composer require docsortingne/dbal

    Ajout à Dmisorting Chebotarev Réponse,

    Si vous souhaitez modifier plusieurs colonnes à la fois, vous pouvez le faire comme ci-dessous

     DB::statement(' ALTER TABLE `events` MODIFY `event_date` DATE NOT NULL, MODIFY `event_start_time` TIME NOT NULL, MODIFY `event_end_time` TIME NOT NULL; '); 

    Ajout à la réponse de Dmisorting Chebotarev, comme pour Laravel 5+.

    Après avoir demandé le package docsortingne / dbal :

     composer require docsortingne/dbal 

    Vous pouvez ensuite effectuer une migration avec des colonnes nullables, comme ceci:

     public function up() { Schema::table('users', function (Blueprint $table) { // change() tells the Schema builder that we are altering a table $table->integer('user_id')->unsigned()->nullable()->change(); }); } 

    Pour annuler l’opération, faites:

     public function down() { /* turn off foreign key checks for a moment */ DB::statement('SET FOREIGN_KEY_CHECKS = 0'); /* set null values to 0 first */ DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;'); /* alter table */ DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'); /* finally turn foreign key checks back on */ DB::statement('SET FOREIGN_KEY_CHECKS = 1'); 

    }

    Pour Laravel 4.2, la réponse ci-dessus d’Unnawut est la meilleure. Mais si vous utilisez un préfixe de table, vous devez modifier légèrement votre code.

     function up() { $table_prefix = DB::getTablePrefix(); DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;'); } 

    Et pour vous assurer que vous pouvez toujours annuler votre migration, nous ferons également le down() .

     function down() { $table_prefix = DB::getTablePrefix(); DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'); } 

    Essayez-le:

     $table->integer('user_id')->unsigned()->nullable();