Machen Sie die Spalte in einer Laravel-Migration nicht nullbar


126

Ich schreibe gerade eine Migration, um bestimmte Spalten in einer Tabelle zu nullableerstellen. Für die Abwärtsfunktion möchte ich diese Spalten natürlich not nullablewieder erstellen . Ich habe die Schema-Builder-Dokumente durchgesehen , aber keinen Weg gefunden, dies zu tun.

Jede Hilfe wäre dankbar.


Die vollständigste Antwort auf diese Frage finden Sie hier: stackoverflow.com/a/32568625/4908847
szaman

Antworten:


226

Vor Laravel 5 gab es keine native Laravel-Methode zum Ändern einer vorhandenen Tabellenspalte mithilfe des Schema-Generators. Sie müssten hierfür Rohabfragen verwenden.

Ab Laravel 5 können Sie jedoch Folgendes verwenden:

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

1
Das habe ich auch gefunden. Eine nette Geste wäre, wenn der Schema-Generator Spaltendefinitionen ändern könnte, die er anscheinend nicht unterstützt. Ich bin sicher, dass es viele andere wie mich gibt, die den Schema-Generator verwenden, um eine vorhandene Datenbank zu ändern, und nicht nur Tabellen von Grund auf neu erstellen.
Sean the Bean

3
Taylor Otwell (Schöpfer von Laravel) sagte vor 6 Tagen (09.05.2014): "Ich stehe immer noch zu meiner Aussage, dass wenn jemand es erfolgreich und sauber machen kann, ich es zusammenführen werde." github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
@Musa Anscheinend können Sie eine Spalte auf null setzen (z. B. :), $table->string('colmn', 255)->nullable()->change();aber das Gegenteil scheint nicht zu funktionieren ( $table->string('colmn', 255)->change();), daher müssen Sie hierfür noch rohe Datenbankabfragen verwenden
Luís Cruz

5
Siehe @ MattMcDonalds Antwort unten. Sie können nullable () verwenden, um es nullbar zu machen, und nullable (false), um es in einer Migration nicht nullbar zu machen.
Ajon

5
nullable(false)funktioniert nicht für mich in Laravel 5.3 :(
Stalinko

38

Ab Laravel 5 ist es möglich, dies nativ umzukehren - übergeben Sie einfach false als Argument an nullable ().

z.B

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

Es klappt! Aufgrund von Updates für Laravel ist dies die richtige Antwort geworden.
Jlbang

Vielen Dank, obwohl ich nicht verstehe, warum Spalten standardmäßig nicht nullwertfähig gemacht werden. Dies ist normalerweise eine bewährte Methode, die dem Code viel Rauschen hinzufügt.
Morgan

1
Spalten sind standardmäßig nicht null. Das Poster fragte nur, wie eine bereits Nullspalte umgekehrt werden kann.
Matt McDonald

2

Führen Sie zuerst Folgendes aus:

composer require doctrine/dbal

Erstellen Sie dann eine Migration, die die Tabelle folgendermaßen ändert:

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
Gibt es einen Grund, die gesamte Spalte in der Rollback-Routine zu löschen? Die down () -Methode sollte nur die Logik der up () -Methode rückgängig machen, um fortlaufende Migrationen vorwärts und rückwärts zu unterstützen.
Andrew

0

Sie können die Spalte einfach ohne -> nullable () erneut deklarieren und -> change verwenden

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();
    });
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.