You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Doctrine QueryBuilder中addSelect用DATE_FORMAT/DATE_ADD报错求助

解决Doctrine QueryBuilder中DATE_FORMAT与DATE_ADD的语法错误

问题根源

Doctrine的DQL(Doctrine查询语言)和原生SQL的函数语法不兼容:

  • DQL的DATE_ADD不支持原生SQL的INTERVAL 14 DAY写法,必须遵循DATE_ADD(日期字段, 间隔值, '单位')的格式
  • 默认DQL未内置MySQL的DATE_FORMAT函数,需要额外配置或用原生表达式替代

可行解决方案

方案1:标准DQL函数+自定义DATE_FORMAT

  1. 修正DATE_ADD写法
    把原生SQL风格的DATE_ADD(jo.createdAt, INTERVAL 14 DAY)改成DQL支持的格式:

    DATE_ADD(jo.createdAt, 14, 'DAY')
    
  2. 注册DATE_FORMAT自定义函数
    先通过Composer安装Doctrine扩展库:

    composer require beberlei/doctrineextensions
    

    然后在Doctrine配置文件(如config/packages/doctrine.yaml)中添加:

    doctrine:
        orm:
            dql:
                string_functions:
                    DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
    

    之后即可正常使用QueryBuilder:

    $qb = $this->getEntityManager()->createQueryBuilder()
        ->select('jo')
        ->addSelect('DATE_FORMAT(DATE_ADD(jo.createdAt, 14, \'DAY\'), \'%Y-%m-%d\') as deleteDate')
        ->from(JobOfferEntity::class, 'jo')
        ->where('jo.isDeleted = :isDeleted')
        ->setParameter('isDeleted', 0);
    

方案2:用FUNCTION()调用原生函数

无需依赖第三方库,直接通过DQL的FUNCTION()语法调用原生MySQL函数:

$qb = $this->getEntityManager()->createQueryBuilder()
    ->select('jo')
    ->addSelect('FUNCTION(\'DATE_FORMAT\', DATE_ADD(jo.createdAt, 14, \'DAY\'), \'%Y-%m-%d\') as deleteDate')
    ->from(JobOfferEntity::class, 'jo')
    ->where('jo.isDeleted = :isDeleted')
    ->setParameter('isDeleted', 0);

方案3:直接使用原生SQL查询

如果不想折腾DQL配置,直接写原生SQL更简单:

$conn = $this->getEntityManager()->getConnection();
$sql = <<<SQL
    SELECT jo.*, DATE_FORMAT(DATE_ADD(jo.created_at, INTERVAL 14 DAY), "%Y-%m-%d") as deleteDate
    FROM job_offer jo
    WHERE jo.is_deleted = :isDeleted
SQL;
$stmt = $conn->prepare($sql);
$stmt->execute(['isDeleted' => 0]);
$result = $stmt->fetchAllAssociative();

内容的提问来源于stack exchange,提问作者gondor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:05:12