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
相关产品推荐
相关产品推荐

