В моей модели у меня есть следующее:
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 []; }