TYPO3 - запрос доктрины НЕ ГДЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ, если реальный путь для записи не существует

Я отображаю столбец uid, abc и имя таблицы tx_abc_domain_model_abc...

... но теперь я хочу отображать только те записи, для которых НЕ был создан реальный путь.

Итак, я думаю, мне нужно НЕ ГДЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ (https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Database/QueryBuilder/Index.html#join-innerjoin-rightjoin-and-leftjoin) для двух таблиц tx_abc_domain_model_abc и tx_realurl_uniqalias?

table: tx_abc_domain_model_abc
column: uid

table: tx_realurl_uniqalias
column: tablename = tx_abc_domain_model_abc
column: value_id

Контроллер действий:

...
$statement = $queryBuilder  
    ->select('tx_abc_domain_model_abc.uid', 'tx_abc_domain_model_abc.abc', 'tx_abc_domain_model_abc.name')          
    ->from('tx_abc_domain_model_abc')
    ->join(
      'tx_abc_domain_model_abc',
      'tx_realurl_uniqalias'
      $queryBuilder->expr()->eq('tx_realurl_uniqalias.value_id', $queryBuilder->quoteIdentifier('tx_abc_domain_model_abc.uid'))
    )
   ->where(
      $queryBuilder->expr()->eq('tx_realurl_uniqalias.tablename', $queryBuilder->createNamedParameter('tx_abc_domain_model_abc')),
        )                                       
    ->execute();
...

Это верно? Но как НЕ ГДЕ?


person Philipp M    schedule 20.11.2017    source источник
comment
в SQL это будет шаблон anti-join. Это было бы внешнее соединение с условием в предложении WHERE, которое проверяет наличие NULL в выражении, которое гарантированно будет не-NULL, если совпадение найдено. Например, чтобы получить строки из a без соответствующих строк в b, мы могли бы написать что-то вроде этого: FROM a LEFT JOIN b ON b.a_id = a.id WHERE b.a_id IS NULL. (обратите внимание, что a_id в совпадающей строке гарантированно не равен NULL при сравнении на равенство). Это также может быть выражено как предикат не существует, например. FROM a WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)   -  person spencer7593    schedule 21.11.2017
comment
Спасибо за информацию. Случайно... не могли бы вы также привести пример, отражающий вышеизложенное?   -  person Philipp M    schedule 21.11.2017
comment
Я не могу привести пример... Я не знаю синтаксиса typo3 для антиобъединения или NOT EXISTS (crsq). Я подозреваю, что typo3 похож на другие ORM в том, что в документации и примерах не признается, что операция антиобъединения, возможно, является чем-то, что мы могли бы захотеть сделать. (Мои SQL-конструкции были оставлены в комментарии, так как это был вопрос о typo3.) Мой вопрос будет примерно таким: как мне заставить typo3 выдавать и выполнять антиобъединение, подобное этому: SELECT a.foo FROM a LEFT JOIN b ON b.a_id = a.id WHERE b.a_id IS NULL   -  person spencer7593    schedule 22.11.2017


Ответы (1)


Вы можете сделать НЕ с помощью -›neq :

->neq($fieldName, $value) 

Итак, на вашем примере:

$queryBuilder->expr()->neq('tx_realurl_uniqalias.tablename', $queryBuilder->createNamedParameter('tx_abc_domain_model_abc'))

Вы можете прочитать его здесь: https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/ExpressionBuilder/Index.html#comparisons

person Kristof    schedule 14.09.2018