Rendre la colonne non nullable dans une migration Laravel


128

J'écris une migration pour créer certaines colonnes dans une table en nullablece moment. Pour la fonction down, je veux bien sûr créer à not nullablenouveau ces colonnes . J'ai parcouru la documentation du générateur de schéma , mais je n'ai pas trouvé de moyen de le faire.

Toute aide serait appréciée.


la réponse la plus complète à cette question peut être trouvée ici: stackoverflow.com/a/32568625/4908847
szaman

Réponses:


232

Avant Laravel 5, il n'existait aucun moyen natif Laravel de modifier une colonne de table existante à l'aide du générateur de schéma. Vous auriez besoin d'utiliser des requêtes brutes pour cela.

Cependant, à partir de Laravel 5, vous pouvez utiliser:

$table->...->nullable(false)->change();

1
C'est ce que j'ai trouvé aussi. Une bonne idée serait que le constructeur de schéma permette de modifier les définitions de colonne, ce qu'il ne semble pas prendre en charge. Je suis sûr qu'il y en a beaucoup d'autres comme moi qui utilisent le générateur de schéma pour modifier une base de données existante, pas seulement pour créer des tables à partir de zéro.
Sean the Bean

3
Taylor Otwell (créateur de Laravel) a déclaré il y a 6 jours (09/05/2014): "Je maintiens toujours ma déclaration selon laquelle si quelqu'un peut le faire avec succès et proprement, je le fusionnerai." github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
@Musa Apparemment, vous pouvez définir une colonne nullable (ex:) $table->string('colmn', 255)->nullable()->change();mais l'inverse ne semble pas fonctionner ( $table->string('colmn', 255)->change();), vous devez donc toujours utiliser des requêtes de base de données brutes pour cela
Luís Cruz

5
Voir la réponse de @ MattMcDonald ci-dessous. Vous pouvez utiliser nullable () pour le rendre nullable et nullable (false) pour le rendre non nullable dans une migration.
ajon

5
nullable(false)ne fonctionne pas pour moi dans Laravel 5.3 :(
Stalinko

38

À partir de Laravel 5, il est possible d'inverser cela de manière native - il suffit de passer false comme argument à nullable ().

par exemple

$table -> string('foo') -> nullable(false) -> change();

Ça marche! C'est donc devenu la bonne réponse en raison des mises à jour de Laravel.
jlbang

Merci, même si je ne comprends pas pourquoi les colonnes ne sont pas rendues non nulles par défaut. C'est généralement la meilleure pratique et cela ajoute beaucoup de bruit au code.
Morgan le

1
Les colonnes sont non nulles par défaut. L'affiche demandait simplement comment inverser une colonne déjà nulle.
Matt McDonald

2

Exécutez d'abord ceci:

composer require doctrine/dbal

Ensuite, créez une migration qui modifiera la table comme ceci:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

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

4
Y a-t-il une raison de supprimer la colonne entière dans la routine de restauration? La méthode down () doit simplement annuler la logique de la méthode up () pour prendre en charge les migrations progressives vers l'arrière et vers l'avant.
Andrew

1

Vous pouvez simplement déclarer à nouveau la colonne sans -> nullable () et utiliser -> changer

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
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.