【问题标题】:Laravel not retrieving milliseconds in DateTime columnsLaravel 没有在 DateTime 列中检索毫秒
【发布时间】:2019-01-29 15:00:40
【问题描述】:

在 Laravel 中,我有一些以毫秒为单位的列。请注意,其他一些列没有毫秒数(例如created_atupdated_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)。

为什么会发生这种情况,我该如何解决这个问题?

请注意,这不是 Carbon 问题,因为我根本没有在该字段中使用 Carbon。

我在这里看到了一个类似的问题:

Laravel timestamps to show milliseconds

声称这实际上是一个 PDO 问题并建议使用字符串或时间戳。但这是一个相当老的答案,所以我希望有一个更好的答案。

【问题讨论】:

  • 只是写@cfnerd 的答案。 format("m-d-Y H:i:s.u") 必须有效。
  • @cfnerd 首先,我什至还没有将 Carbon 引入其中。所以format 方法不可用。但即使我在 casts 属性中添加 dateTime,它也只会返回毫秒为 0。
  • 并不是我不能用 Carbon。返回的属性是一个字符串。我什至没有将它转换为任何其他类型。所以将字符串2018-12-19 01:40:46 转换为DateTime,然后格式化就行不通了。

标签: laravel laravel-5 laravel-5.6


【解决方案1】:

这个问题与 Laravel 无关,而是由于新版本 MySQL 的 PDO 中的一个已知错误。

此问题存在于 PHP 7.2 中,并已在 PHP 7.3 中修复。

所以要解决这个问题,只需升级到 PHP 7.3

如果您想自动转换为 Carbon 日期,我发现以下对于 settingsavingtoArray 不起作用:

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 setSyncDateTimeAttribute(Carbon $value): void
{
    $this->attributes['fidel_created'] = $value->format('Y-m-d H:i:s.v');
}

但请记住,您仍然需要升级到 PHP 7.3!

【讨论】:

  • 请修正第二个方法名(设置...)。谢谢
  • @mwallisch 完成。好地方
【解决方案2】:

把它放在模型的顶部:

protected $dates = ['sync_date_time'];

Laravel 会自动将其转换为 Carbon 实例,然后您可以简单地使用以下格式对其进行格式化:

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

您也可以尝试在模型顶部设置受保护的$dateFormat 变量。

【讨论】:

  • 试过了,但毫秒只是显示为零
  • 而且它们在数据库中肯定 100% 不是零,对吗?因为如果保存时不提供它们将被默认。
  • 数据库中 100% 不为零。使用任何新版本的 MySQL 自行尝试。这似乎是一个已知问题。
  • 您能进入 mysql 并运行查询以选择带有日期时间的记录吗? select sync_date_time from table where x = y 之类的东西是否显示微秒?
  • 是的。该问题可以通过升级到 PHP 7.3 来解决。这是 PDO 中的一个错误。
【解决方案3】:

我在 Lumen 8 上遇到了同样的错误。

我已经在我的模型类中更改了这段代码:

protected $casts = [
    'last_activity_at' => 'datetime',
];

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

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

现在可以很好地节省毫秒数。

我也试过这段代码,但它不起作用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 2014-08-07
    • 2010-09-11
    • 2016-03-15
    • 1970-01-01
    • 2022-01-17
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多