将 SQL 函数与学说和 TYPO3 一起使用

Using SQL functions with doctrine and TYPO3

我正在将一个旧的 TYPO3 扩展迁移到当前版本,并试图将我的数据库访问权限更改为 using doctrine。大多数情况下效果很好,但现在我遇到了一些 select 查询,它们使用了 SQL 函数,例如"Year(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 user functions 再次实现该功能,但是 typo3 网站上的文档没有提及这一点,所以我是不确定如何进行。

有人能指出我正确的方向吗?

如有任何帮助,我们将不胜感激

问候 西奥

我默认使用 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']);

你可以使用普通的 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)
    )