Сделать столбец не допускающим значения NULL при миграции на Laravel

130

Я пишу миграцию, чтобы сделать определенные столбцы в таблице nullableпрямо сейчас. Для функции вниз я, конечно, хочу снова создать эти столбцы not nullable. Я просмотрел документацию по построителю схемы , но не нашел способа сделать это.

Любая помощь будет оценена.

bilalq
источник
1
наиболее полный ответ на этот вопрос можно найти здесь: stackoverflow.com/a/32568625/4908847
szaman

Ответы:

235

До Laravel 5 не было встроенного способа Laravel изменить существующий столбец таблицы с помощью построителя схемы. Для этого вам нужно будет использовать необработанные запросы.

Однако, начиная с Laravel 5, вы можете использовать:

$table->...->nullable(false)->change();
TLGreg
источник
1
Я тоже это обнаружил. Приятным прикосновением к построителю схемы было бы разрешение изменять определения столбцов, которые он, похоже, не поддерживает. Я уверен, что есть много других, подобных мне, которые используют построитель схем для изменения существующей БД, а не только для создания таблиц с нуля.
Шон Бин
3
Тейлор Отвелл (создатель Laravel) сказал 6 дней назад (2014-05-09): «Я все еще придерживаюсь своего утверждения, что если кто-то сможет успешно и чисто сделать это, я объединю его». github.com/laravel/framework/issues/895#issuecomment-42709756
Райан,
3
@Musa По-видимому, вы можете установить столбец, допускающий значение NULL (например:), $table->string('colmn', 255)->nullable()->change();но обратное, похоже, не работает ( $table->string('colmn', 255)->change();), поэтому вам все равно нужно использовать для этого необработанные запросы к базе данных
Луис Крус,
5
См. Ответ @ MattMcDonald ниже. Вы можете использовать nullable (), чтобы сделать его допускающим значение NULL, и допускающим значение NULL (false), чтобы сделать его не допускающим значения NULL при миграции.
ajon
6
nullable(false)у меня не работает в Laravel 5.3 :(
Stalinko
40

Начиная с Laravel 5, это можно отменить изначально - просто передайте false в качестве аргумента функции nullable ().

например

$table -> string('foo') -> nullable(false) -> change();
Мэтт Макдональд
источник
Оно работает! Итак, это стало правильным ответом из-за обновлений Laravel.
jlbang
Спасибо, хотя я не понимаю, почему столбцы по умолчанию не допускают значения NULL. Обычно это лучшая практика, и это добавляет много шума в код.
Morgan
2
По умолчанию столбцы не равны NULL. Плакат просто спрашивал, как отменить уже пустой столбец.
Мэтт Макдональд
3

Сначала запустите это:

composer require doctrine/dbal

Затем создайте миграцию, которая изменит таблицу следующим образом:

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
источник
5
Есть ли причина отбрасывать весь столбец в программе отката? Метод down () должен просто отменять логику метода up () для поддержки отката миграции назад и вперед.
Эндрю
2

Вы можете просто снова объявить столбец без -> nullable () и использовать -> изменить

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();
    });
}
Габриэль Фернандес
источник