【问题标题】:TYPO3: repository->findAll() not workingTYPO3:存储库->findAll() 不起作用
【发布时间】:2017-06-14 08:14:22
【问题描述】:

我正在构建一个带有后端模块的扩展。当我调用 findAll() 方法时,它返回一个“QueryResult”对象。

我尝试使用 findByUid() 检索对象,它确实有效。

我在打字稿中设置了存储pid:

plugin.tx_hwforms.persistence.storagePid = 112

我也可以在打字稿对象浏览器中看到它。

我还将它添加到我的存储库类中:

public function initializeObject()
    {
        $defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
        $defaultQuerySettings->setRespectStoragePage(false);
        $this->setDefaultQuerySettings($defaultQuerySettings);
    }

以便忽略存储 pid ... 它仍然无法正常工作,findAll 没有返回应有的实体数组

【问题讨论】:

  • 上面的 sn-p 似乎没问题。您确定表中有与此存储库相关的记录吗?
  • 嗨,安德烈,是的,我确定。我还尝试使用另一个扩展的存储库,其中 findAll() 工作正常。而且我注意到它也不起作用,因此由于某种原因 findAll 在我的扩展程序中根本不起作用。
  • 所以,var_dump(使用 extbase 中的函数)调用 findAll() 函数后的 $GLOBALS['TYPO3_DB'] 并检查最后一个查询构建
  • 我试过了,但它完全忽略了 findAll 方法。它适用于其他存储库方法,例如 findByUid 甚至 findAll()->count ... 这对我没有任何意义
  • 很奇怪。您的存储库是否扩展了 TYPO3::CMS::Extbase::Persistence::Repository ?您是否检查了存储库、模型和表名之间的名称拼写?

标签: typo3 typoscript fluid


【解决方案1】:

存储库必须findAll 方法返回一个QueryResult。只有返回单个对象 (findOneByXYZ) 的方法才会返回任何其他内容。

以下所有操作都会导致 QueryResult 加载它包含的实际结果。在您执行其中一项之前,不会加载任何结果,并且调试 QueryResult 将不会产生除原始查询之外的任何信息。

  • $queryResult->toArray();
  • $queryResult->offsetGet($offset);$queryResult[$offset];
  • $queryResult->offsetExists($offset);
  • $queryResult->offsetSet($offset, $value);$queryResult[$offset] = $value;(但请注意,使用 QueryResult 自己执行此操作是不合逻辑的)。
  • $queryResult->offsetUnset($offset);unset($queryResult[$offset]);(同样,自己使用这个不合逻辑)
  • $queryResult->current()->key()->next()->prev()->rewind()->valid() 都可以直接调用,也可以在开始迭代 QueryResult 时调用。

请注意,->getFirst()->count() 不会触发原始查询,并且如果结果尚未填充,则不会填充结果。相反,他们将执行优化的查询。

Summa summarum:当您获得 QueryResult 时,您必须以某种方式触发它,这通常在您开始呈现结果集时发生。它不是一个预填充的数组;它是一个动态填充的迭代器。

【讨论】:

    【解决方案2】:

    这应该可以工作。在 FindAll() extbase 检查存储时您的存储页面一定有问题,但在 findByXXX() 中它忽略了存储。

    $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\Extbase\\Object\\ObjectManager');
    $querySettings = $objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
    $querySettings->setRespectStoragePage(FALSE);
    
    $this->cityRepository->setDefaultQuerySettings($querySettings);
    $cities = $this->cityRepository->findAll();
    

    【讨论】:

    • 我在控制器中尝试了你的代码,但它仍然返回一个“QueryResult”对象
    • @user6800816 如果你想在 Array 而不是 QueryResult 对象中获取结果,那么你需要使用 toArray()
    【解决方案3】:

    使用额外的打字模块配置,如

    module.tx_hwforms.persistence.storagePid = 112
    

    确保您的 Typoscript 已加载到根目录中。对于 BE 模块,我更喜欢使用

    EXT:hwforms/ext_typoscript_setup.txt
    

    您在哪里编写模块和 extbase 配置。

    【讨论】:

    • 我按照你说的在 ext_typoscript_setup.txt 中为模块设置了 storagePid 但不幸的是它仍然无法正常工作:(
    • 我的正确答案!我在 ts_setup 中使用 config.tx_extbase.persistence.storagePid = 5。确保您使用的是正确的 PID,有一些条目!
    【解决方案4】:

    尝试像下面这样调试并检查此存储库的 findAll() 方法。我觉得这对你有用click here

    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(get_class_methods($this->yourRepositryName)); exit();
    

    一旦你需要uninsatll/install 扩展,Afetr 就会添加你所有的更改。

    【讨论】:

    • 我试过调试,但它没有用 findAll() 转储任何东西...我用 findAll()->count() 试过,然后它就可以工作了。也试过卸载并重新安装扩展,但还是一样
    • 检查一下你的扩展 setup.txt 和 contant.txt 文件 storagePid 打字稿 sysntaxt 权限与否?
    • 是的语法是正确的,它也显示在后端的打字稿对象浏览器中
    【解决方案5】:

    我会检查生成的查询本身。在安装工具中配置如下选项:

    $GLOBALS["TYPO3_CONF_VARS"]["sqlDebug"]
    

    注意:不要在生产环境中这样做!!

    sqlDebug 说明:

    将其设置为 “0” 将避免在屏幕上打印任何信息。

    将其设置为 "1" 只会显示错误。

    将其设置为 "2" 将在屏幕上打印所有查询。

    所以在生产环境中你希望它保持为“0”,在开发环境中你应该将它设置为“1”,如果你想知道为什么某些结果为空,请将其配置为“2”。

    我猜是某些 enablefield 配置会导致您的问题。

    如果您通过 findByUid 检索对象,您将获得返回,因为 enablefields 被忽略。在所有其他情况下,启用字段都会被应用,这可能会导致您的结果为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2017-11-15
      相关资源
      最近更新 更多