是否可以在更新和 extbase 记录时抑制时间戳更新?

Is it possible to surpress tstamp update when updating and extbase record?

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

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

所以我的问题是:是否可以针对某个查询或一般情况(之后再次激活)停用或绕过此行为?当然,我完全可以绕过 extbase ORM 并自己用纯 SQL 更新该记录,但我认为这是一个不太好的解决方案:-)

类似这样的问题最好通过查看代码来回答:

tstamp 值由 repo update 查询自动更新,因为 addCommonDateFieldsToRow (called from updateObject via addCommonFieldsToRow). This automatism happens if $dataMap->getModificationDateColumnName() !== null, which happens if the TCA $controlSection['tstamp'] of the respective table is set(通常是这种情况)。

由于缓存了 $dataMap,暂时取消设置 $GLOBALS['TCA']['your_table']['ctrl']['tstamp'] 将不起作用。在调用 addCommonDateFieldsToRow 之前似乎没有任何挂钩入口点,也没有(有 emitAfterUpdateObjectSignal,但这在更新 之后被称为 - 和有 没有 emit*Before*UpdateObjectSignal).

补救措施可能是实施 UPDATEquery_preProcessAction 挂钩并从 $fields_values 中删除 tstamp 以供您在那里查询。不过,此挂钩将在 每个 TYPO3 更新查询时调用。

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

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

绕过 extbase ORM

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