Laravel вставляет `0000-00-00` вместо null, когда для DB установлено значение `->nullable()` и `->default(null)`

#php #date #laravel-5 #nullable #homestead

#php #Дата #laravel-5 #nullable #усадьба

Вопрос:

Я использую Laravel 5.1 в Homestead Vagrant box, PHP 7.2.14 в Ubuntu 18.04 с MySQL 5.7.25.

Я создал миграцию с этим:

 $table->date('expiry_date')->nullable()->default(null);
  

У меня есть форма с полем даты под названием expiry_date , для которого по умолчанию установлено значение null:

 {!! Form::date('expiry_date', null, array('class' => 'form-control')) !!}
  

Когда я ввожу дату в поле, все работает нормально, но когда я оставляю его пустым, оно вставляется 0000-00-00 в базу данных, что затем портит отображение в моем представлении. Единственный способ, которым я смог это исправить, — добавить это в модель:

 public function setExpiryDateAttribute($value)
{
    $this->attributes['expiry_date'] = $value ?: null;
}
  

Я раздражен тем, что мне приходится выполнять этот дополнительный шаг, и это не очень похоже на «Laravel», что заставляет меня поверить, что я что-то упускаю.

Интересно то, что он проходит проверку в моем пользовательском запросе:

 'expiry_date' => 'date',
  

Редактировать:

Я protected $dates ['expiry_date'] установил в модели, и это также было добавлено к массовому назначению.

Комментарии:

1. Насколько я знаю, вы не можете обнулить время. По умолчанию используется 0000-00-00 00:00.

2. input type="date" значение по умолчанию html5 может быть 0000-00-00 пустым… так что технически это не null. смотрите developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date

3. Спасибо @ O-9, я попробую и вернусь к вам