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

use*_*816 5 typo3 fluid typoscript

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

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

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

plugin.tx_hwforms.persistence.storagePid = 112
Run Code Online (Sandbox Code Playgroud)

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

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

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

这样存储 pid 就被忽略了...它仍然不起作用,findAll 没有返回应有的实体数组

Cla*_*Due 8

存储库必须从方法返回 QueryResult findAll。只有返回单个对象 ( 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 时,您必须以某种方式触发它,这通常在您开始呈现结果集时发生。它不是一个预填充数组;它是一个动态填充的迭代器。


Bha*_*mar 5

这应该可以工作。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();
Run Code Online (Sandbox Code Playgroud)