【问题标题】:Is it possible to surpress tstamp update when updating and extbase record?更新和 extbase 记录时是否可以抑制 tstamp 更新?
【发布时间】:2017-11-23 02:59:29
【问题描述】:

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

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

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

【问题讨论】:

  • 根据我的经验(有一些复杂的 TYPO3 安装),绕过 extbase ORM 通常是最好的解决方案。

标签: typo3 extbase typo3-7.6.x


【解决方案1】:

此类问题最好通过查看代码来回答:

由于addCommonDateFieldsToRow(从updateObject 通过addCommonFieldsToRow 调用),update 查询会自动更新tstamp 值。如果$dataMap->getModificationDateColumnName() !== null 会发生这种自动化,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:您还可以考虑更改数据模型并将视图计数器移动到单独的表中。

【讨论】:

  • 我已经查看了代码,但没有那么深(停在addCommonDateFieldsToRow):-) 由于性能影响,不能使用通用挂钩。对于 xclass 解决方案也是如此,它也具有我通常期望此更新tstamp 的副作用,因此我必须通过所有核心方法提取参数。似乎纯 SQL 是这里唯一的解决方案,这是 v8 中的 Doctrine 的另一个原因,它有望在这种情况下带来更大的灵活性。
  • 您是否考虑过我上次通过将视图计数器从记录中提取到单独的记录视图计数器表来更改数据模型的建议?
  • 这不起作用:$rawSql = 'UPDATE xyz SET view_counter = view_counter + 1 WHERE uid = ' . $obj->getUid(); $query = $this->createQuery(); $query->statement($rawSql); $query->execute(true); 因为PHP Fatal error: Call to a member function fetch_assoc() on a non-object。所以我不得不$GLOBALS['TYPO3_DB']->exec_UPDATEquery( 'xyz', 'uid = '.$obj->getUid(), ['view_counter' => $obj->getViewCounter() + 1], TRUE );
  • 是的,我确实考虑到了这一点,但这也会对性能造成影响,因为需要再完成一次连接,这在使用这些计数器导出 2mio+ 记录时是个问题值。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多