Laravel 未在 DateTime 列中检索毫秒数
Laravel not retrieving milliseconds in DateTime columns
在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;
它总是 returns 没有毫秒部分的字符串(例如 2018-12-19 01:40:46
)。
为什么会发生这种情况,我该如何解决这个问题?
请注意,这不是 Carbon 问题,因为我根本没有在该字段中使用 Carbon。
我在这里看到了类似的问题:
Laravel timestamps to show milliseconds
声称这实际上是一个 PDO 问题并建议使用字符串或时间戳。但这是一个很老的答案,所以我希望有更好的答案。
将其放在模型的顶部:
protected $dates = ['sync_date_time'];
Laravel 会自动将其转换为 Carbon 实例,然后您可以使用以下格式简单地进行格式化:
$brand->sync_date_time->format('Y-m-d H:i:s.u')
您也可以尝试在模型顶部设置受保护的 $dateFormat
变量。
此问题与 Laravel 无关,但由于 MySQL.
较新版本的 PDO 中存在已知错误
此问题存在于 PHP 7.2 中,并已在 PHP 7.3 中修复。
所以要解决这个问题,只需升级到 PHP 7.3.
如果您想自动转换为 Carbon 日期,我发现以下内容在涉及 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 setSyncDateTimeAttribute(Carbon $value): void
{
$this->attributes['fidel_created'] = $value->format('Y-m-d H:i:s.v');
}
但请记住,您仍然需要升级到 PHP 7.3!
我在 Lumen 8 中遇到了同样的错误。
我已经在我的模型中更改了这段代码 class :
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',
];
在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;
它总是 returns 没有毫秒部分的字符串(例如 2018-12-19 01:40:46
)。
为什么会发生这种情况,我该如何解决这个问题?
请注意,这不是 Carbon 问题,因为我根本没有在该字段中使用 Carbon。
我在这里看到了类似的问题:
Laravel timestamps to show milliseconds
声称这实际上是一个 PDO 问题并建议使用字符串或时间戳。但这是一个很老的答案,所以我希望有更好的答案。
将其放在模型的顶部:
protected $dates = ['sync_date_time'];
Laravel 会自动将其转换为 Carbon 实例,然后您可以使用以下格式简单地进行格式化:
$brand->sync_date_time->format('Y-m-d H:i:s.u')
您也可以尝试在模型顶部设置受保护的 $dateFormat
变量。
此问题与 Laravel 无关,但由于 MySQL.
较新版本的 PDO 中存在已知错误此问题存在于 PHP 7.2 中,并已在 PHP 7.3 中修复。
所以要解决这个问题,只需升级到 PHP 7.3.
如果您想自动转换为 Carbon 日期,我发现以下内容在涉及 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 setSyncDateTimeAttribute(Carbon $value): void
{
$this->attributes['fidel_created'] = $value->format('Y-m-d H:i:s.v');
}
但请记住,您仍然需要升级到 PHP 7.3!
我在 Lumen 8 中遇到了同样的错误。
我已经在我的模型中更改了这段代码 class :
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',
];