我正在使用后端模块构建扩展。当我调用 findAll ()方法时,它返回一个" QueryResult"对象
我尝试使用 findByUid ()检索对象,但它确实有效。
我在typoscript中设置了存储pid:
plugin.tx_hwforms.persistence.storagePid = 112
我也可以在typoscript对象浏览器中看到它。
我还将此添加到我的存储库类:
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
以便忽略存储pid ... 它仍然无法正常工作,findAll不会返回一系列的entites,因为它应该
答案 0 :(得分:3)
这应该可行。在FindAll()的存储页面中必须存在问题,检查存储空间,但在findByXXX()中它会忽略存储。
bool
答案 1 :(得分:3)
存储库必须从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 :(得分:2)
另外使用typoscript模块配置,例如
EXT:hwforms/ext_typoscript_setup.txt
确保您的Typoscript以root身份加载。对于BE模块,我更喜欢使用
answer
您编写模块和extbase配置的地方。
答案 3 :(得分:1)
尝试如下所示进行debbug并检查此存储库中的findAll()
方法。我认为这对你有用click here
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(get_class_methods($this->yourRepositryName)); exit();
Afetr在您需要uninsatll/install
分机后添加了所有更改。
答案 4 :(得分:1)
我会检查生成的查询本身。在安装工具中配置以下选项:
$GLOBALS["TYPO3_CONF_VARS"]["sqlDebug"]
注意:请勿在生产环境中执行此操作!!
sqlDebug的解释:
将其设置为“0”将避免在屏幕上显示任何信息。
将其设置为“1”只会显示错误。
将其设置为“2”将在屏幕上打印所有查询。
因此,在生产中,您希望将其保持为“0”,在开发环境中,您应将其设置为“1”,如果您想知道为什么某些结果为空,请将其配置为“2”。
我猜想一些启用字段配置会导致您的问题。
如果通过findByUid检索对象,则会返回,因为会忽略enablefields。在其他所有情况下都会应用启用字段,这可能会导致空结果。