TYPO3:存储库->findAll() 不起作用

问题描述 投票:0回答:5

我正在构建一个带有后端模块的扩展。当我调用 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 没有返回应有的实体数组

typo3 typoscript fluid
5个回答
8
投票

Repository must

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 时,您必须以某种方式触发它,这通常在您开始呈现结果集时发生。它不是一个预填充数组;它是一个动态填充的迭代器。


6
投票

这应该可行。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();

2
投票

另外使用typoscript模块配置,例如

module.tx_hwforms.persistence.storagePid = 112

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

EXT:hwforms/ext_typoscript_setup.txt

您编写模块和 extbase 配置的位置。


1
投票

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

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

注意:不要在生产环境中执行此操作!!

sqlDebug 说明:

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

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

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

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

我猜想某些启用字段配置会导致您的问题。

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


1
投票

尝试像下面这样进行调试并检查此存储库中存在的

findAll()
方法。我认为这对您有用点击这里

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

添加所有更改后,您需要

uninstall/install
扩展程序。

© www.soinside.com 2019 - 2024. All rights reserved.