wazum / datetime-fractional-seconds
支持小数秒的 DATETIME 自定义 Doctrine 类型
Requires
- php: ^8.2
- typo3/cms-core: ^11 || ^12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- slevomat/coding-standard: ^8.8
- squizlabs/php_codesniffer: ^3.7
- vimeo/psalm: ^5.6
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
];
如果你使用另一个执行相同操作的扩展,你必须自己处理。