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

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

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

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

2016-01-23 22:00

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

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

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


person Hardist    schedule 23.01.2016    source источник


Ответы (7)


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 вызывается, вот откуда берется настраиваемый формат. Формат по умолчанию - , определенный в классе 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
comment
Отличный ответ. Такой качественный ответ. Я не мог не прокомментировать этот непродуктивный комментарий. :) - person Bhargav Nanekalva; 05.04.2017
comment
У меня та же проблема, что это решение мне не помогло, не могли бы вы взглянуть - person ; 05.04.2018
comment
Это отлично подходит для времени, но PITA для полей только с датой. Нет смысла добавлять к ним время, и они также не могут храниться таким образом; однако в именах есть большая двусмысленность, поскольку это даты в прямом смысле слова. - person Jonas D.; 15.02.2019
comment
Когда я использую Postgresql, некоторые значения времени сохраняются без миллисекундной части (когда она равна нулю). Тогда формат даты всегда будет давать ошибку, как указано выше. Итак, наконец, я могу исправить это только с помощью специального аксессуара для поля. Но это решение просто проигнорировало исходный формат данных. - person mytharcher; 13.08.2019

Модели

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

public function getDates()
{
    return [];
}
person Cristhian Carreño    schedule 09.11.2016

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

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

person subzeta    schedule 23.01.2016
comment
Принимая это, поскольку это дает мне больше возможностей, полностью пропустил вариант $dateFormat. - person Hardist; 23.01.2016

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

person mazedlx    schedule 23.01.2016

Убедитесь, что вы не пропустили поля created_at или updated_at в некоторых строках вашей базы данных, которые являются обязательными; в этом случае удалите записи, в которых есть эти пустые поля, или введите значение в допустимом формате временной метки, например «2018-09-01 15:18:53».

person davidprogramador01    schedule 27.10.2018

Это одна из возможностей

Вам необходимо проверить столбец результирующих данных. Если имя вашего столбца created_at или updated_at имеет значение null, то эта ошибка будет устранена.

Как решить? Прежде всего, вам нужно сохранить данные в этих двух столбцах с помощью Laravel Carbon. Например:

$user = new User();
$user->created_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->updated_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->save();

Это все, я надеюсь, что это сработает

Удачного кодирования ....

person Inamur Rahman    schedule 27.05.2019

Для меня проблема заключалась в том, что SQLServerGrammar находился у поставщика (vendor \ laravel \ framework \ src \ Illuminate \ Database \ Query \ Grammars \ SqlServerGrammar.php). По умолчанию в SQLServerGramma установлено значение Y-m-d H:i:s.v.

Мы расширили класс end и удалили .v.

person tety94    schedule 20.01.2020