【问题标题】:TYPO3 extension repository truncate queryTYPO3 扩展存储库截断查询
【发布时间】:2014-04-17 11:42:52
【问题描述】:

我需要通过我的 TYPO3 扩展的存储库清除 (TRUNCATE) 一个数据库表。我已经有各种有效的 SELECT 查询。它们看起来像这样:

public function getUsergroups() {

    $query = $this->createQuery();
    $query->getQuerySettings()->setReturnRawQueryResult(TRUE);

    $query->statement('SELECT * FROM fe_groups WHERE hidden=0 AND deleted=0');

    $result = $query->execute();

    return $result;
}

这行得通。

然后是清空数据库表的功​​能,看起来是这样的:

public function updateProductPermissions($submitArray) {
    $query = $this->createQuery();
    $query->getQuerySettings()->setReturnRawQueryResult(TRUE);

    $query->statement('TRUNCATE TABLE tx_chiliproducts_domain_model_permission')->execute();

    return true;
}

当这个函数被执行时,我得到以下错误:

致命错误:在非对象上调用成员函数 fetch_assoc() 在 /srv/globalroot/typo3_src-6.1.1/typo3/sysext/core/Classes/Database/DatabaseConnection.php 在第 1029 行

执行 SELECT 和执行 TRUNCATE 语句有什么区别?为什么一个有效而另一个无效?

【问题讨论】:

  • 我刚刚尝试了一个向表中插入新数据的函数。它会导致与 TRUNCATE 函数相同的错误。难道“写”语句(TRUNCATE、INSERT)的处理方式必须不同于“读”(SELECT)语句吗?

标签: php sql typo3 extbase


【解决方案1】:

我不确定您是否可以通过 extbase 持久层进行截断。如果你想让你的生活更轻松,只需使用普通的 TYPO3 CMS 数据库类:

$GLOBALS['TYPO3_DB']->exec_TRUNCATEquery('table');

请记住,extbase 可能不知道此截断,并且它可能仍有一些对象在缓存中。

API 方式是调用$repository->removeAll()

【讨论】:

  • removeAll() 方法仅适用于当前存储库。如果 tx_chiliproducts_domain_model_permission 是当前存储库的表,那么它将不会工作。
  • 感谢removeAll()的建议!基本上,这很好用,因为我在正确的存储库中。但与 truncate 语句不同,此函数不会重置 UID。一段时间后,我担心这会因为巨大的 UID 值而变得非常丑陋。有没有与 truncate 语句等效的语句?
  • 不是最好的主意,但它可能会起作用:首先使用 removeAll() 从表中删除内容,然后使用 TYPO3s 数据库 API 方法 exec_TRUNCATEquery() 重置 uid。除此之外,您可以向forge.typo3.org/projects/typo3cms-core/issues 提交功能请求以将其内置。
  • 感谢 Stefano,这两个命令的组合对我有用!
  • 最后一件事 - 顺序很重要:首先是 $GLOBALS['TYPO3_DB']->exec_TRUNCATEquery('tx_chiliproducts_domain_model_permission');,然后是 $this->removeAll();。当我反过来尝试时,我遇到了只有前几个条目被写入数据库的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
相关资源
最近更新 更多