Использование SQL функций с doctrine и TYPO3 - PullRequest
0 голосов
/ 04 февраля 2020

Я переношу старое расширение TYPO3 в текущую сборку и пытаюсь изменить доступ к моей базе данных, используя doctrine. По большей части это работало замечательно, но теперь я наткнулся на несколько запросов на выборку, которые используют SQL -функции, например, «Год (FROM_UNIXTIME ())».

Я пытался использовать sql функция как есть в следующем виде:

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

$queryBuilder
     ->select('i.*','c.title AS cat_title','c.uid AS cat_uid')
     ->from('mytable','i')
    ->join('c'
        ...
    )
    ->join('d'
        ...
    )
    ->where(
         $queryBuilder->expr()->eq('Year(FROM_UNIXTIME(i.datetime))', $queryBuilder->createNamedParameter($year, \PDO::PARAM_STR))
    )       

Проблема только в части where, если я получаю считывание оператора SQL, предложение where просто пропускается, как если бы строка кода никогда не было.

Затем я приступил к созданию операторов отладки вокруг оператора where и инкапсулировал его в блок try catch с прикрепленным к нему журналом: он выполняется нормально, без ошибок, но ничего не делает.

После Google, я теперь считаю, что мне нужно было бы снова реализовать эту функцию с помощью пользовательских функций DQL , но документация на сайте typo3 не содержит упоминаний об этом, и поэтому я немного не знаете, как поступить.

Может ли кто-нибудь указать мне правильное направление?

Любая помощь будет высоко ценится

С уважением, Тео

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Вы можете использовать обычный SQL:

$queryBuilder
    ->select('i.*','c.title AS cat_title','c.uid AS cat_uid')
    ->from('mytable','i')
    ->join('c'
        ...
    )
    ->join('d'
        ...
    )
    ->where(
        'Year(FROM_UNIXTIME(i.datetime)) = '.$queryBuilder->createNamedParameter($year, \PDO::PARAM_STR)
    )
0 голосов
/ 07 февраля 2020

Я по умолчанию использовал php, чтобы проанализировать годы до полных дат и преобразовать их в unix отметки времени. Была возможность использовать ORM, но она слишком сложна для обработки.

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

// to convert towards db:
$queryBuilder->createNamedParameter(mktime(0,0,0,1,1, (int)$year), \PDO::PARAM_INT)
// and back:
$queryBuilder->select('i.datetime AS yearb')
// ... the rest of the query seems of litle interest
;
$current = date("Y",$queryBuilder->execute()->fetch()['yearb']);
...