Spraw, aby kolumna nie dopuszczała wartości null w migracji Laravel

129

Piszę teraz migrację, aby utworzyć określone kolumny w tabeli nullable. W przypadku funkcji w dół oczywiście chcę ponownie utworzyć te kolumny not nullable. Przejrzałem dokumentację narzędzia do tworzenia schematów , ale nie znalazłem sposobu, aby to zrobić.

Każda pomoc będzie mile widziana.

bilalq
źródło
1
najpełniejszą odpowiedź na to pytanie można znaleźć tutaj: stackoverflow.com/a/32568625/4908847
szaman

Odpowiedzi:

233

Przed Laravel 5 nie było natywnego sposobu modyfikowania istniejącej kolumny tabeli przy użyciu narzędzia do tworzenia schematów w Laravel. W tym celu musisz użyć nieprzetworzonych zapytań.

Jednak od Laravel 5 możesz użyć:

$table->...->nullable(false)->change();
TLGreg
źródło
1
To też znalazłem. Miłym akcentem byłoby dla konstruktora schematu, który pozwoliłby na zmianę definicji kolumn, których wydaje się nie obsługiwać. Jestem pewien, że jest wielu takich jak ja, którzy używają konstruktora schematów do modyfikowania istniejącej bazy danych, a nie tylko do tworzenia tabel od zera.
Sean the Bean
3
Taylor Otwell (twórca Laravel) powiedział 6 dni temu (09.05.2014): „Nadal podtrzymuję swoje stwierdzenie, że jeśli ktoś może to zrobić skutecznie i czysto, to połączę to”. github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan
3
@Musa Najwyraźniej możesz ustawić wartość zerową kolumny (np .:), $table->string('colmn', 255)->nullable()->change();ale odwrotność nie wydaje się działać ($table->string('colmn', 255)->change(); ), więc nadal musisz używać do tego surowych zapytań db
Luís Cruz
5
Zobacz odpowiedź @ MattMcDonald poniżej. Możesz użyć nullable (), aby zezwolić na nullable i nullable (false), aby nie dopuszczać wartości null w migracji.
ajon
6
nullable(false)nie działa dla mnie w Laravel 5.3 :(
Stalinko
39

Począwszy od Laravel 5, można to odwrócić natywnie - po prostu przekaż false jako argument do nullable ().

na przykład

$table -> string('foo') -> nullable(false) -> change();
Matt McDonald
źródło
To działa! Więc to stała się poprawną odpowiedzią z powodu aktualizacji Laravel.
jlbang
Dzięki, chociaż nie rozumiem, dlaczego domyślnie kolumny nie dopuszczają wartości null. Zwykle jest to najlepsza praktyka, a to dodaje dużo szumu do kodu.
Morgan,
2
Kolumny są domyślnie niezerowe. Plakat pytał tylko, jak odwrócić już pustą kolumnę.
Matt McDonald
3

Najpierw uruchom to:

composer require doctrine/dbal

Następnie utwórz migrację, która zmieni tabelę w następujący sposób:

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');
    });
}
funerr
źródło
4
Czy istnieje powód, aby porzucić całą kolumnę w procedurze wycofywania? Metoda down () powinna po prostu cofnąć logikę metody up (), aby obsługiwać migracje kroczące w przód iw tył.
Andrew,
2

Możesz po prostu zadeklarować kolumnę ponownie bez -> nullable () i użyć -> change

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();
    });
}
Gabriel Fernandez
źródło