wazum/datetime-fractional-seconds

此包的最新版本(1.1.0)没有可用的许可信息。

支持小数秒的 DATETIME 自定义 Doctrine 类型

安装: 5

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:typo3-cms-extension

1.1.0 2023-06-12 18:00 UTC

This package is auto-updated.

Last update: 2024-09-13 07:25:09 UTC


README

这是一个支持小数秒的 TYPO3 Doctrine 自定义类型。

用例

如果你需要更多控制数据库中记录的顺序,你需要小数秒的精度。

假设你有一个事件驱动系统,并将事件存储在数据库中,多个事件在同一秒内存储(非常可能),如果你希望以正确的顺序处理事件流,你需要更高的精度时间戳。

背景

Doctrine(TYPO3使用的ORM)不支持 DATETIME 字段的分数秒。

关于此有一个开放的 issue:[doctrine/dbal#2873](https://github.com/doctrine/dbal/issues/2873)

先决条件

需要一个支持 DATETIME 小数秒的数据库。👆此扩展支持 MariaDB 10.2+、MySQL 5.7+ 和 PostgreSQL 10+。其他数据库系统不受影响,将回退到默认行为。

你可以在以下评论中找到支持数据库系统的列表:[doctrine/dbal#2873 (评论)](https://github.com/doctrine/dbal/issues/2873#issuecomment-602283947)

如果你需要与 TYPO3 一起使用此行为并自己实现了它,请提交一个 pull request。

安装

composer require "wazum/datetime-fractional-seconds"

使用

安装后,每个在 ext_tables.sql 中具有 小数秒精度DATETIME 字段——例如 occurred_on DATETIME(6)——都将创建为此长度(6)。任何没有精度长度的 DATETIME 字段将不会创建精度(默认行为)。

具有数据库字段的精度后,你可以在代码中使用支持此格式的格式(以下示例中的 .u 为长度六)。

有关格式选项,请参阅 [https://php.ac.cn/manual/en/datetimeimmutable.createfromformat.php](https://php.ac.cn/manual/en/datetimeimmutable.createfromformat.php)

private const DATETIME_FORMAT = 'Y-m-d H:i:s.u';

public function __invoke(SomethingHappened $event): void 
{
    $occurredOn = \DateTimeImmutable::createFromFormat(
        self::DATETIME_FORMAT,
        $event->getOccurredOn()
    );
}

可能出现的问题

扩展 ConnectionPool

此扩展扩展了核心 ConnectionPool 以获取数据库连接。

$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Core\Database\ConnectionPool::class] = [
    'className' => \Wazum\DatetimeFractionalSeconds\Core\Database\ConnectionPool::class
];

如果你使用另一个执行相同操作的扩展,你必须自己处理。