TYPO3/Extbase中带有and和OR的嵌套查询

TYPO3/Extbase中带有and和OR的嵌套查询,typo3,extbase,nested-queries,Typo3,Extbase,Nested Queries,我需要为TYPO3扩展构建一些复杂的查询。其中一个查询是在给定用户集或默认项集中查找自定义项。默认条目保存为cruser\u id=0。因此,有必要构建嵌套的逻辑运算符 我试过的方法如下: public function findById($cId, $userId) { $query = $this->createQuery(); $query->getQuerySettings()->setEnableFieldsToBeIgnored(['pid', 'c

我需要为TYPO3扩展构建一些复杂的查询。其中一个查询是在给定用户集或默认项集中查找自定义项。默认条目保存为
cruser\u id=0
。因此,有必要构建嵌套的逻辑运算符

我试过的方法如下:

public function findById($cId, $userId) {
    $query = $this->createQuery();
    $query->getQuerySettings()->setEnableFieldsToBeIgnored(['pid', 'cruser_id', 'sys_language_uid']);

    $res = $query->matching(
        $query->logicalAnd(
            $query->equals("id", $cId),
            $query->logicalOr(
                $query->equals("cruser_id", $userId), //include custom entries
                $query->equals("cruser_id", 0) //also include default entries
            )
    ))->execute()->getFirst();
    print_r($res);

这不起作用:-(我试图调试,但我没有发现代码中有错误的迹象。如果有人能在这里帮助我,那就太好了。

总结一下评论:

如果您的记录不在已配置的持久性pid
plugin.tx\u yourext.persistence.storagePid
中,或者您根本没有配置持久性存储,那么您需要禁用pid检查

setEnableFieldsToBeIgnored
只能应用于所谓的启用字段,在大多数情况下,这些字段是禁用的、结束时间的、fe组的、开始时间的,并通过
$GLOBALS['TCA'][$table]['ctrl']['enablecolumns']
进行配置


要抑制pid检查,您应该使用
setPerrectStoragePage(false)
。对于sys\u语言,有一个
setPerrectSysLanguage(false)
。并且cruser\u id根本没有被检查,所以您可以跳过它。

对于我来说,您的约束看起来是正常的,除了
setEnableFieldsToBeIgnored(['pid',cruser\u id',sys\u language\u uid'))
-这些不是启用字段。您是否检查了已生成的查询?我花了很多时间调试SQL查询,但发现了问题。在生成约束之前,我应该执行
$query->getQuerySettings()->setOrderStoragePage(false);
以忽略
pid
。谢谢您的提示!