Laravel не получает миллисекунды в столбцах DateTime - PullRequest
0 голосов
/ 29 января 2019

В Laravel у меня есть несколько столбцов с миллисекундами.Обратите внимание, что некоторые другие столбцы не имеют миллисекунд (например, created_at, updated_at).

Вот моя миграция:

Schema::create('brands', function (Blueprint $table) {
    $table->increments('id');
    $table->dateTime('sync_date_time', 3);
    $table->timestamps();
});

Моя модель просто:

class Brand extends Model {}

Тем не менее, когда у меня есть запись с миллисекундами (например, 2018-12-19 01:40:46.512), и я выполняю:

$brand->sync_date_time;

Всегда возвращает строку без миллисекундной части (например, 2018-12-19 01:40:46).

Почему это происходит и как я могу решить эту проблему?

Обратите внимание, что это не проблема с углеродом, поскольку я вообще не использую углерод для этого поля.

Iвидел подобный вопрос здесь:

метки времени Laravel для отображения миллисекунд

, которые утверждают, что это на самом деле проблема PDO и предлагают использовать строку или метку времени.Но это довольно старый ответ, поэтому я надеялся, что есть лучший ответ.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Эта проблема не имеет ничего общего с Laravel, но из-за известной ошибки в PDO с более новыми версиями MySQL.

Эта проблема существует в PHP 7.2 и была исправлена ​​в PHP 7.3.

Итак, чтобы решить эту проблему, просто обновитесь до PHP 7.3 .

Если вы хотите автоматически привести к дате углерода, я обнаружил, что следующее НЕ работает, когда дело доходит до setting, saving и toArray:

protected $casts = [
   'sync_date_time' => 'datetime:Y-m-d H:i:s.v',
];

Вместо этого я обнаружил, что у вас ничего не должно быть в приведениях для столбцов, и добавьте в модель следующие методы:

public function getSyncDateTimeAttribute(string $value): Carbon
{
    return Carbon::createFromFormat('Y-m-d H:i:s.v', $value);
}

public function getSyncDateTimeAttribute(Carbon $value): void
{
    $this->attributes['fidel_created'] = $value->format('Y-m-d H:i:s.v');
}

Но помните, что вам все равно нужно перейти на PHP 7.3!

0 голосов
/ 29 января 2019

Поместите это вверху вашей модели:

protected $dates = ['sync_date_time'];

Laravel автоматически приведёт это к экземпляру Carbon, который вы затем можете отформатировать просто:

$brand->sync_date_time->format('Y-m-d H:i:s.u')

Вы также можете попробовать установить защищенную переменную $dateFormat в верхней части модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...