TYPO3: repository->findAll() 不工作
TYPO3: repository->findAll() not working
我正在构建一个带有后端模块的扩展。当我调用 findAll() 方法时,它 return 是一个 "QueryResult" 对象。
我尝试使用 findByUid() 检索对象,它确实有效。
我在错别字中设置了存储pid:
plugin.tx_hwforms.persistence.storagePid = 112
我在typoscript对象浏览器中也能看到。
我也将其添加到我的存储库 class:
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
以便忽略存储 pid ...
它仍然无法正常工作,findAll 没有 return 它应该
的实体数组
使用额外的 typoscript 模块配置,例如
module.tx_hwforms.persistence.storagePid = 112
确保您的 Typoscript 已加载到根目录中。对于 BE 模块,我更喜欢使用
EXT:hwforms/ext_typoscript_setup.txt
编写模块和 extbase 配置的位置。
尝试像下面这样调试并检查此存储库存在的 findAll()
方法。我认为这对你有用click here
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(get_class_methods($this->yourRepositryName)); exit();
一旦您需要 uninsatll/install
扩展,Afetr 添加了所有更改。
这应该 work.there 一定是您在 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();
我会检查生成的查询本身。在安装工具中配置以下选项:
$GLOBALS["TYPO3_CONF_VARS"]["sqlDebug"]
注意:不要在生产环境中这样做!!
sqlDebug 的解释:
将其设置为 "0" 将避免在屏幕上打印任何信息。
将其设置为 "1" 将仅显示错误。
将其设置为 "2" 将在屏幕上打印所有查询。
所以在Production环境中要保持为“0”,在开发环境中应该设置为“1”,如果你想知道为什么有些结果为空,请将其设置为“2”。
我猜是某些 enablefield 配置导致了您的问题。
如果您通过 findByUid 检索对象,您将得到 return,因为启用字段将被忽略。在所有其他情况下,都会应用启用字段,这可能会导致您的结果为空。
Repository 必须 return 来自 findAll
方法的 QueryResult。只有 return 单个对象 (findOneByXYZ
) 的方法才会 return 任何其他对象。
以下所有操作都会导致 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 时,您必须以某种方式触发它,这通常发生在您开始呈现结果集时。它不是预填充数组;它是一个动态填充的迭代器。
我正在构建一个带有后端模块的扩展。当我调用 findAll() 方法时,它 return 是一个 "QueryResult" 对象。
我尝试使用 findByUid() 检索对象,它确实有效。
我在错别字中设置了存储pid:
plugin.tx_hwforms.persistence.storagePid = 112
我在typoscript对象浏览器中也能看到。
我也将其添加到我的存储库 class:
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
以便忽略存储 pid ... 它仍然无法正常工作,findAll 没有 return 它应该
的实体数组使用额外的 typoscript 模块配置,例如
module.tx_hwforms.persistence.storagePid = 112
确保您的 Typoscript 已加载到根目录中。对于 BE 模块,我更喜欢使用
EXT:hwforms/ext_typoscript_setup.txt
编写模块和 extbase 配置的位置。
尝试像下面这样调试并检查此存储库存在的 findAll()
方法。我认为这对你有用click here
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(get_class_methods($this->yourRepositryName)); exit();
一旦您需要 uninsatll/install
扩展,Afetr 添加了所有更改。
这应该 work.there 一定是您在 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();
我会检查生成的查询本身。在安装工具中配置以下选项:
$GLOBALS["TYPO3_CONF_VARS"]["sqlDebug"]
注意:不要在生产环境中这样做!!
sqlDebug 的解释:
将其设置为 "0" 将避免在屏幕上打印任何信息。
将其设置为 "1" 将仅显示错误。
将其设置为 "2" 将在屏幕上打印所有查询。
所以在Production环境中要保持为“0”,在开发环境中应该设置为“1”,如果你想知道为什么有些结果为空,请将其设置为“2”。
我猜是某些 enablefield 配置导致了您的问题。
如果您通过 findByUid 检索对象,您将得到 return,因为启用字段将被忽略。在所有其他情况下,都会应用启用字段,这可能会导致您的结果为空。
Repository 必须 return 来自 findAll
方法的 QueryResult。只有 return 单个对象 (findOneByXYZ
) 的方法才会 return 任何其他对象。
以下所有操作都会导致 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 时,您必须以某种方式触发它,这通常发生在您开始呈现结果集时。它不是预填充数组;它是一个动态填充的迭代器。