Как перенести устаревшую функцию exec_SELECT_mm_query в Querybuilder / Connection на основе Doctrine в TYPO3 - PullRequest
0 голосов
/ 03 апреля 2019

Предположим следующий фрагмент кода:

$res = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query(
    $foreign . '.*', $local, $mm, $foreign, 'AND ' . $local . '.uid=' . $constraintUid);

while ($r=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
...
  • $ Foreign / Foreign: имя таблицы иностранных БД
  • $ local / local: имя локальной таблицы БД
  • $ мм / мм: имя таблицы БД отношений (обычно что-то другое)
  • $ constraintUid / constraintUid: некоторый идентификатор

Я бы хотел перенести код в TYPO3 9, используя функции базы данных на основе Doctrine.


Приведенный выше код преобразуется в следующий оператор SQL:

SELECT foreign.* FROM local,mm,foreign 
    WHERE    local.uid=mm.uid_local 
        AND  foreign.uid=mm.uid_foreign 
        AND  local.uid = constraintUid

см. exec_SELECT_mm_query :

Параметры:

  • string $ select Список полей для SELECT
  • строка $ local_table Имя таблицы, локальная таблица
  • строка $ mm_table Имя таблицы, таблица отношений
  • строка $ foreign_table Имя таблицы, сторонняя таблица
  • string $ whereClause Необязательные дополнительные предложения WHERE, помещаемые в конец запроса. ...
  • ...

1 Ответ

0 голосов
/ 03 апреля 2019

Мое предложение будет:

$foreign = 'a';
$mm = 'mm';
$local = 'b';
$item = 1;

/** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */
$queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    \TYPO3\CMS\Core\Database\ConnectionPool::class
)->getQueryBuilderForTable($foreign);
$expr = $queryBuilder->expr();

/** @var \Doctrine\DBAL\Driver\Statement $rows */
$rows = $queryBuilder
    ->select('foreign.*')
    ->from($foreign, 'foreign')
    ->innerJoin('foreign', $mm, 'mm', $expr->eq('foreign.uid', 'mm.uid_foreign'))
    ->innerJoin('mm', $local, 'local', $expr->eq('mm.uid_local', 'local.uid'))
    ->where(
        $expr->eq('local.uid', $queryBuilder->createNamedParameter($item, \PDO::PARAM_INT))
    )
    ->execute();

while (($row = $rows->fetch()) != null) {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...