Typo3 在更新和extbase记录时是否可能超过tstamp update?

Typo3 在更新和extbase记录时是否可能超过tstamp update?,typo3,extbase,typo3-7.6.x,Typo3,Extbase,Typo3 7.6.x,我有一个TYPO3扩展名(extbase,TYPO3 7.6),在控制器showAction中,我增加给定记录的viewCounter属性,然后在相应的存储库类上调用$repo->update($entity) 问题是,在这个网站的另一个地方,有一个“更改”记录列表,它利用了这些记录的tstamp字段。所以现在的问题是,每次加载实体时,计数器都会增加,extbase内部也会自动更新tstamp值。在这种情况下,现在根本不需要它 因此,我的问题是:是否可以为某个查询停用或绕过此行为,或者通常(之后

我有一个TYPO3扩展名(extbase,TYPO3 7.6),在控制器
showAction
中,我增加给定记录的
viewCounter
属性,然后在相应的存储库类上调用
$repo->update($entity)

问题是,在这个网站的另一个地方,有一个“更改”记录列表,它利用了这些记录的
tstamp
字段。所以现在的问题是,每次加载实体时,计数器都会增加,extbase内部也会自动更新
tstamp
值。在这种情况下,现在根本不需要它


因此,我的问题是:是否可以为某个查询停用或绕过此行为,或者通常(之后再次激活)?当然,我可以完全绕过extbase ORM,自己用纯SQL更新该记录,但是,我认为一个不太好的解决方案是:-(<)/P> < P >这样的问题最好通过查看代码: 由于(从via调用),repo
update
查询会自动更新
tstamp
值。这种自动性发生在,发生在(通常情况下)

在缓存$dataMap时,暂时取消设置
$GLOBALS['TCA']['your_table']['ctrl']['tstamp']
将不起作用。在调用
addCommonDateFieldsToRow
之前似乎没有任何钩子入口点,也没有(有,但这是在更新之后调用的,并且在*UpdateObjectSignal之前没有
emit*)

一种补救方法是实现一个钩子,并从
$fields\u values
中删除
tstamp
,以便查询。不过,对于每一个TYPO3更新查询,都会调用这个钩子

另一种解决方法(我经常使用)是扩展(XCLASS)有问题的核心代码。在您的情况下,您可以扩展
\TYPO3\CMS\Extbase\Persistence\Generic\Backend::addCommonDateFieldsToRow
,而不为您的特殊域对象添加
tstamp

正如我在对您的问题的评论中所说的:与其浪费时间处理extbase约定和限制,最好的解决方案通常是使用普通SQL绕过extbase ORM


PS:您也可以考虑更改数据模型并将视图计数器移到单独的表。

在我的经验中(使用一些复杂的TyPO3安装),绕过ExtBaseORM通常是最好的解决方案。我已经查看了代码,但没有深入到(在<代码> AddioMealDeDeFieldSturoO)。:-)由于性能影响,使用通用钩子不是一个选项。对于xclass解决方案也是如此,它还有一个副作用,我通常希望这次更新
tstamp
之类的东西,因此我必须通过所有核心方法提取一个参数。似乎纯SQL是这里唯一的解决方案,这是v8中条令的另一个原因,希望在这种情况下带来更大的灵活性。您是否考虑过我的上一个建议,即通过将视图计数器从记录提取到单独的记录viewcounter表来更改数据模型?这不起作用:
$rawSql='UPDATE xyz设置view\u counter=view\u counter+1,其中uid='$obj->getUid()$query=$this->createQuery()$查询->语句($rawSql)$查询->执行(true)
由于
PHP致命错误:对非对象调用成员函数fetch_assoc()
。所以我必须
$GLOBALS['TYPO3\u DB']->exec\u UPDATEquery('xyz','uid='.$obj->getUid(),['view\u counter'=>$obj->getViewCounter()+1],TRUE)
是的,我确实考虑到了这一点,但这也会对性能造成影响,因为需要再进行一次连接,这在导出带有这些计数器值的2mio+记录时是一个问题。