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
修正DATE_ADD写法
把原生SQL风格的DATE_ADD(jo.createdAt, INTERVAL 14 DAY)改成DQL支持的格式:DATE_ADD(jo.createdAt, 14, 'DAY')注册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
相关产品推荐
相关产品推荐

