2015-08-06 8 views
1

Мне нужно создать несколько сложных запросов для расширения TYPO3. Один из этих запросов ищет пользовательскую запись в наборе данного пользователя или в наборе записей по умолчанию. Записи по умолчанию сохраняются с cruser_id = 0. Для этого необходимо построить вложенные логические операторы.Вложенные запросы с AND и OR в TYPO3/Extbase

Я попробовал его следующим образом:

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); 

И это не работает :-(я пытался отладить, но я не нашел никаких указаний на ошибки в своем коде Было бы здорово, если бы кто-то. может помочь мне здесь

+2

Для меня ваши ограничения выглядят нормально, за исключением 'setEnableFieldsToBeIgnored (['pid', 'cruser_id', 'sys_language_uid'])' - это не поля enable. Вы проверили запрос, который был построен? –

+0

Я потратил много времени на отладку SQL-запросов, но нашел свою проблему. Прежде чем создавать ограничения, я должен был бы выполнить '$ query-> getQuerySettings() -> setRespectStoragePage (false);', чтобы игнорировать 'pid'. Спасибо за подсказку! – seboettg

ответ

2

Резюмируя комментарии:.

Если записи расположены не в сконфигурированной настойчивости-PID plugin.tx_yourext.persistence.storagePid, или вы не имеете хранений настойчивости, сконфигурированные на всех, то вам необходимо отключить pid-checks.

setEnableFieldsToBeIgnored может применяться только к так называемым Enable-поля, которые в большинстве случаев являются инвалидами, время окончания, fe_group, время_запуска и конфигурируется с помощью $GLOBALS['TCA'][$table]['ctrl']['enablecolumns'].

Для подавления pid -check, вы должны использовать setRespectStoragePage(false). Для sys_language есть setRespectSysLanguage(false). И cruser_id не проверен вообще, поэтому вы можете пропустить его.