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.