Nach Laravel Update keine leeren Einträge mehr in der Datenbank

Werner S

Mitglied
Hallo,

habe gestern ein Upgrade von Laravel 8 auf 9 durch geführt. Soweit funktioniert alles, allerdings machen die Datenbank Einträge etwas Probleme.

Tabelle anlegen:
$table->string('description')->default(null);

Wenn ich jetzt von einem Formular aus was in die Datenbank eintragen will, das Feld description aber leer lasse, meckert er rum

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'description' cannot be null

Eigentlich sollte dort dieser Teil "->default(null);" das verhindern wenn das Feld nicht ausgefüllt ist oder?

Das habe aktuell bei fast allen Formularen so wo Felder Optional ausgefüllt werden können. Mit Laravel 8 war das nie ein Problem.
 

JR Cologne

Administrator
Teammitglied
Wurde das geändert?
Das heißt ich muss, was vorher funktionierte jetzt komplett Umschreiben?

Erstmal sind default(null) und nullable() zwei komplett unterschiedliche Dinge.

Es gibt in SQL-Datenbanken grundsätzlich die Möglichkeit, null-Werte für eine Column zu verbieten bzw. zu erlauben.
Siehe NOT NULL Constraint -> https://www.w3schools.com/sql/sql_notnull.asp

Zusätzlich gibt es die Möglichkeit, einen Standardwert zu definieren, der gesetzt wird, wenn du nicht explizit was einträgst.
Siehe DEFAULT Constraint -> https://www.w3schools.com/sql/sql_default.asp

Normalerweise können alle Spalten null-Werte entgegennehmen, es kann aber gut sein, dass Laravel die Migrations in Version 9 so angepasst hat, dass standardmäßig die NOT NULL Constraint gesetzt wird und man daher explizit eine Spalte als nullable setzen muss, wenn man dies nicht möchte bzw. wenn der Default-Wert null sein soll.

Der Einsatz von nullable() ist grundsätzlich übrigens der "Richtige", dann wird auch automatisch default(null) angewendet, weswegen der Teil dann praktisch redundant wäre.
 
Zuletzt bearbeitet:

Mat

Aktives Mitglied
Das explizite nullable() ist schon ziemlich lange in Laravel. Dass es vorher ohne ging, wird wohl eine rückwärtskompatible Konvention gewesen sein, die jetzt im Stillen umgestellt wurde.

Das heißt ich muss, was vorher funktionierte jetzt komplett Umschreiben?

Reicht nicht Suchen+Ersetzen? zB: (->default\(\s*null\s*\);) ersetzen durch ->nullable();
 

JR Cologne

Administrator
Teammitglied
Das explizite nullable() ist schon ziemlich lange in Laravel. Dass es vorher ohne ging, wird wohl eine rückwärtskompatible Konvention gewesen sein, die jetzt im Stillen umgestellt wurde.

Ja, stimmt. Hast recht. Habe selbst immer direkt explizit nullable() verwendet und daher nie derartige Probleme gehabt.

Ich denke, es liegt an einer Änderung bei default(null). Das hat wahrscheinlich bisher implizit auch das Gleiche wie nullable() bewirkt.
 
Oben Unten