You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3技术问题:如何获取新持久化Extbase条目的tstamp与crdate

如何在Extbase持久化对象后获取crdate和tstamp?

我之前在Extbase开发过程中也碰到过完全一样的问题!刚把新对象持久化完成后,直接调用getCrdate()或者getTstamp()总是返回null,甚至用findByUid()重新查询,拿到的还是带null值的缓存对象,简直让人头大。下面我给你分享几个亲测有效的解决方法:

方法一:用DataMapper强制刷新对象实例

Extbase的DataMapper类提供了refresh()方法,它会直接从数据库重新加载对象的所有字段值,覆盖内存中旧的对象实例。代码示例:

// 先获取DataMapper实例
$dataMapper = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class
);
// 传入你刚持久化的对象进行刷新
$dataMapper->refresh($yourObject);

// 现在再调用就能拿到正确的值了
$crdate = $yourObject->getCrdate();
$tstamp = $yourObject->getTstamp();

这个方法最直接,刷新后原来的对象实例就被更新了,后续使用也没问题。

方法二:直接用DBAL查询数据库(适合只需要这两个字段的场景)

如果你的需求只是获取crdate和tstamp,不需要整个对象的其他字段,那直接用Doctrine DBAL查询数据库会更高效,还能绕过Extbase的缓存机制:

// 获取对应表的数据库连接
$connectionPool = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    \TYPO3\CMS\Core\Database\ConnectionPool::class
);
$connection = $connectionPool->getConnectionForTable('your_table_name');

// 查询指定uid的crdate和tstamp
$record = $connection->select(
    ['crdate', 'tstamp'],
    'your_table_name',
    ['uid' => $yourObject->getUid()]
)->fetchAssociative();

// 提取结果
$crdate = $record['crdate'] ?? null;
$tstamp = $record['tstamp'] ?? null;

记得把your_table_name替换成你对应的数据库表名哦。

方法三:创建不带缓存的Repository查询

如果习惯用Repository来查询,可以创建一个忽略缓存的查询,强制从数据库读取最新数据:

$query = $this->yourRepository->createQuery();
// 关闭缓存相关设置
$querySettings = $query->getQuerySettings();
$querySettings->setEnableFields(false);
$querySettings->setIgnoreEnableFields(true);
$querySettings->setRespectStoragePage(false); // 如果你的表有存储页限制,按需调整

// 匹配uid查询
$query->matching($query->equals('uid', $yourObject->getUid()));
$freshObject = $query->execute()->getFirst();

// 从新对象获取字段值
$crdate = $freshObject->getCrdate();
$tstamp = $freshObject->getTstamp();

不过这个方法相比DataMapper的refresh会繁琐一点,适合特定场景下使用。

为啥会出现这个问题?

简单说就是Extbase的设计逻辑:当你持久化对象时,它只会把对象的字段写入数据库,但不会主动把数据库自动生成的字段(比如crdate、tstamp,还有自增的uid)同步回内存中的对象实例。而默认的Repository查询会优先使用Extbase的缓存,所以第一次查询拿到的还是内存里的旧对象,自然就没有crdate和tstamp的值了。

内容的提问来源于stack exchange,提问作者c.holtermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:50:18