tl;dr
Ваша строка даты и ваш формат даты отличаются, вам нужно изменить строку формата или изменить строку даты, чтобы они совпадали.
Объяснение
Эта проблема
Эта ошибка возникает, когда функция 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('Y-m-d H:i:s', '2017-01-04 00:52');
Углерод выбросит:
InvalidArgumentException в строке 425 Carbon.php:
Данные отсутствуют
Слишком много данных
Если ваша строка даты «длиннее», чем строка формата, как в этом случае:
Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');
Углерод выбросит:
InvalidArgumentException в строке 425 Carbon.php:
Конечные данные
Под капотом
Согласно документации по мутаторам формат даты по умолчанию: 'Y-m-d H:i:s'
. Обработка даты происходит в функции модели asDateTime
. В последнем условии функция getDateFormat
a> вызывается, вот откуда берется настраиваемый формат. Формат по умолчанию - , определенный в классе Grammar
базы данных < / а>.
Решение
Вы должны убедиться, что строка даты соответствует строке формата.
Измените строку формата
Вы можете переопределить строку формата по умолчанию следующим образом:
class Event extends Model {
protected $dateFormat = 'Y-m-d H:i';
}
У этого подхода есть две проблемы:
- Это будет применяться к каждому полю, определенному в массиве модели
$dates
.
- Вы должны хранить данные в этом формате в базе данных.
Отредактируйте и отформатируйте строки даты
Мое рекомендуемое решение - оставить формат даты по умолчанию 'Y-m-d 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('Y-m-d H:i');
$endTime = $event->end_time->format('Y-m-d H:i');
}
Конечно, поля должны быть изменены на даты:
class Event extends Model {
protected $dates = [
'start_time',
'end_time',
'created_at',
'updated_at',
'deleted_at',
];
}
person
totymedli
schedule
03.01.2017