TYPO3: Как преобразовать инструкцию SQL в typo3 PDO

#typo3 #typo3-9.x

#typo3 #typo3-9.x

Вопрос:

У меня возникла проблема с оператором SQL (подзапросы), когда я пытаюсь реализовать с помощью «QueryBuilder» в TYPO3. Пожалуйста, не могли бы вы помочь мне в этом случае (преобразовать SQL statament в TYPO3 «QueryBuilder»). Спасибо!

Инструкция SQL:

 SELECT * FROM table_1 AS t1
INNER JOIN table_2 AS t2 ON t1.id = t2.id
WHERE t2.date = (SELECT MAX(date) FROM t2 AS t2_Tmp WHERE t2_Tmp.id = t2.id)
 

Я пробовал с этим кодом (пример):

 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
        ->getQueryBuilderForTable('table2');

return $queryBuilder->select('*')
->from('table2')
->innerJoin(
   'table2',
   'table1',
   't1',
   $queryBuilder->expr()->eq('t1.id', $queryBuilder->quoteIdentifier('t2.id'))
)
->where(
    $queryBuilder->expr()->eq('t2.date',
        $queryBuilder->addSelectLiteral($queryBuilder->expr()->max('t2.date', 'date'))
            ->from('t2','t2_tmp')
            ->where($queryBuilder->expr()->eq('t2_tmp.id', $queryBuilder->quoteIdentifier('t2.id')))
    )
)
->execute()
->fetchAll();
 

Комментарии:

1. Итак, что вы пробовали до сих пор? Где именно вы боретесь?

2. Вы можете увидеть мой пример кода

3. И каково точное сообщение об ошибке?

Ответ №1:

Я думаю, вы можете попробовать что-то подобное :

 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
        ->getQueryBuilderForTable('table2');

return $queryBuilder->select('*')
->from('table1', 't1')
->innerJoin(
   't1',
   'table2',
   't2',
   $queryBuilder->expr()->eq('t1.id', $queryBuilder->quoteIdentifier('t2.id'))
)
->where(
    $queryBuilder->expr()->eq('t2.date',
        $queryBuilder->addSelectLiteral("(SELECT MAX(date) FROM t2 AS t2_Tmp WHERE t2_Tmp.id = t2.id)")
    )
)
->execute()
->fetchAll();
 

Ответ №2:

Я нашел решение для этого случая и работаю на себя.

 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('table1');
$subQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('table2');

$queryBuilder->select('*')
        ->from('table1', 't1')
        ->innerJoin(
            't1',
            'table2',
            't2',
            $queryBuilder->expr()->eq('t2.t1_uid', $queryBuilder->quoteIdentifier('t1.uid')))
        ->where(
            $queryBuilder->expr()->eq('t2.date', '(' . $subQueryBuilder->addSelectLiteral(
                "MAX(date) FROM t2 AS t2_tmp WHERE t2_tmp.t1_uid = t2.t1_uid"
                ) . ')'
            )
        )
        ->execute()
        ->fetchAll();