Подтвердить что ты не робот

Отсутствуют данные по углеродным данным 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('Y-m-d H:i:s', '2016-01-23 22:00') in Model.php line 3015

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

4b9b3361

Ответ 1

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 в строке Carbon.php 425:
Отсутствуют данные

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

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

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

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

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

Под капотом

В соответствии с документацией по мутаторам формат даты по умолчанию: 'Y-m-d H:i:s'. Обработка даты происходит в Model asDateTime function. В последнем условии вызывается функция 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',
    ];
}

Ответ 2

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

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

Ответ 5

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

Ответ 6

Это одна возможность

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

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

$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();

Вот и все, надеюсь это сработает

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