Зробіть стовпчик не нульовим під час міграції Laravel


126

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

Будь-яка допомога буде вдячна.


найбільш повну відповідь на це питання можна знайти тут: stackoverflow.com/a/32568625/4908847
szaman

Відповіді:


228

До Laravel 5 не існувало нативного способу зміни Laravel існуючого стовпця таблиці за допомогою конструктора схем. Для цього вам потрібно буде використовувати необроблені запити.

Однак, як і для Laravel 5, ви можете використовувати:

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

1
Це я і знайшов. Приємним штрихом для конструктора схеми було б можливість змінити визначення стовпців, які, схоже, не підтримують. Я впевнений, що є багато інших, як я, які використовують конструктор схем для зміни існуючої БД, а не просто створюють таблиці з нуля.
Шон Бін

3
Тейлор Отвелл (творець Laravel) сказала 6 днів тому (2014-05-09): "Я все ще витримую своє твердження, що якщо хтось може це зробити успішно і чисто, я злитлю це". github.com/laravel/framework/isissue/895#issuecomment-42709756
Ryan

3
@Musa Мабуть, ви можете встановити нульовий стовпець (наприклад:), $table->string('colmn', 255)->nullable()->change();але зворотній вигляд не працює ( $table->string('colmn', 255)->change();), тому для цього все одно потрібно використовувати необроблені запити
Luís Cruz,

5
Дивіться відповідь @ MattMcDonald нижче. Ви можете використовувати nullable (), щоб зробити його nullable та nullable (false), щоб зробити його не нульовим під час міграції.
айон

5
nullable(false)не працює для мене в Laravel 5.3 :(
Сталінко

38

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

напр

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

Це працює! Тож це стало правильною відповіддю через оновлення до Laravel.
jlbang

Дякую, хоча я не розумію, чому стовпці за замовчуванням не робляться нульовими. Зазвичай це найкраща практика, і це додає коду багато шуму.
Морган

1
Стовпці за замовчуванням є ненульовими. Плакат просто запитував, як повернути вже нульовий стовпець.
Метт Макдональд

2

Спочатку запустіть це:

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');
    });
}

4
Чи є причина залишити весь стовпець під час відкату? Метод down () повинен просто скасувати логіку методу up () для підтримки рухомих міграцій назад і вперед.
Андрій

1

Ви можете просто оголосити стовпець ще раз без -> nullable () та використовувати -> 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();
    });
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.