Отсутствуют данные по углеродным данным Laravel

В моей модели у меня есть следующее:

protected $dates = [ 'start', 'end', 'created_at', 'updated_at' ]; 

Я использую сборщик datetime, чтобы вставить даты начала и окончания в этом формате:

 2016-01-23 22:00 

Без секунд. Когда я делаю это так, я получаю эту ошибку:

 InvalidArgumentException in Carbon.php line 425: Data missing at Carbon::createFromFormat('Ymd H:i:s', '2016-01-23 22:00') in Model.php line 3015 

Если я включаю секунды, это работает. Секунды для меня не важны, и я не хочу включать их в поля сбора данных datetime. В любом случае, я могу использовать эти поля в качестве полей даты?

ТЛ; др

Строка даты и формат даты разные, вам нужно изменить строку формата или изменить строку даты, чтобы они совпадали.

объяснение

Проблема

Эта ошибка возникает, когда функция createFromFormat Carbon createFromFormat строку даты, которая не соответствует переданной строке формата. Точнее это происходит из функции DateTime::createFromFormat , потому что Carbon просто вызывает это:

 public static function createFromFormat($format, $time, $tz = null) { if ($tz !== null) { $dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz)); } else { $dt = parent::createFromFormat($format, $time); // Where the error happens. } if ($dt instanceof DateTime) { return static::instance($dt); } $errors = static::getLastErrors(); throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors'])); // Where the exception was thrown. } 

Недостаточно данных

Если ваша строка даты «короче», чем строка формата, например, в этом случае:

 Carbon::createFromFormat('Ymd H:i:s', '2017-01-04 00:52'); 

Углерод будет бросать:

InvalidArgumentException в строке Carbon.php 425:
Отсутствуют данные

Слишком много данных

Если строка даты «длиннее», чем строка формата, например, в этом случае:

  Carbon::createFromFormat('Ymd H:i', '2017-01-02 00:27:00'); 

Углерод будет бросать:

InvalidArgumentException в строке Carbon.php 425:
Трейлинг данных

Под капотом

Согласно документации по мутаторам формат даты по умолчанию: 'Ymd H:i:s' . Обработка даты происходит в функции asDateTime модели . В последнем условии getDateFormat функция getDateFormat , откуда приходит пользовательский формат. Формат по умолчанию определяется в классе Grammar базы данных .

Решение

Вы должны убедиться, что строка даты соответствует строке формата.

Изменение строки формата

Вы можете переопределить строку формата по умолчанию следующим образом:

 class Event extends Model { protected $dateFormat = 'Ymd H:i'; } 

Существует две проблемы с этим подходом:

  • Это применимо к каждому полю, определенному в массиве $dates модели.
  • Вы должны хранить данные в этом формате в базе данных.

Редактирование и форматирование строк даты

Мое рекомендуемое решение заключается в том, что формат даты должен оставаться по умолчанию 'Ymd H:i:s' и вы должны заполнить недостающие части даты, например:

 public function store(Request $request) { $requestData = $request->all(); $requestData['start_time'] .= ':00'; $requestData['end_time'] .= ':00'; $event = new Event($requestData); $event->save(); } 

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

 public function show(Request request, $eventId) { $event = Event::findOrFail($eventId); $startTime = $event->start_time->format('Ymd H:i'); $endTime = $event->end_time->format('Ymd H:i'); } 

Конечно, поля должны быть изменены до дат:

 class Event extends Model { protected $dates = [ 'start_time', 'end_time', 'created_at', 'updated_at', 'deleted_at', ]; } 

Вы можете установить $ dateFormat в своей модели, как говорит христианин, но если вы не хотите вводить поля updated_at и created_at в операцию, вы можете использовать события для «исправления» объекта datetime перед сохранением его в базе данных.

Здесь у вас есть официальный документ об этом: https://laravel.com/docs/5.2/eloquent#events

Вам необходимо установить protected $dateFormat в 'Ymd H:i » в вашей модели, см. https://laravel.com/docs/5.2/eloquent-mutators#date-mutators

модели

Эта функция отключена, эмуляция для углерода в Datetimes https://laravel.com/docs/5.0/eloquent#date-mutators

 public function getDates() { return []; }