Doctrine中如何实现获取字段子串的最大数值,不使用原生SQL执行方法
实现方案
方案1:完全使用ExpressionBuilder构建(推荐)
Doctrine的表达式构建器内置了coalesce、cast、substring、max全部所需方法,直接链式调用即可:
$qb = $this->createQueryBuilder('tablename'); $maxCodeNum = $qb ->select( $qb->expr()->coalesce( $qb->expr()->max( $qb->expr()->cast( $qb->expr()->substring('tablename.code', 9, 3), \Doctrine\DBAL\Types\Types::INTEGER // 未引入Types类时可直接写字符串 'INTEGER' ) ), 0 ) ) ->from(Tablename::class, 'tablename') ->getQuery() ->getSingleScalarResult();
方案2:直接使用DQL原生语法(更简洁)
DQL本身默认支持COALESCE、CAST、SUBSTRING等标准SQL函数,不需要完全依赖表达式构建器,可以直接写DQL片段:
$qb = $this->createQueryBuilder('tablename'); $maxCodeNum = $qb ->select('COALESCE(MAX(CAST(SUBSTRING(tablename.code, 9, 3) AS INTEGER)), 0)') ->from(Tablename::class, 'tablename') ->getQuery() ->getSingleScalarResult();
注意事项
- 要确保SUBSTRING的起始位置符合实际数据格式,示例中的起始位置9对应
ABC-DEF-共8个前缀字符,若前缀长度有变化需要同步调整 - 两种方案最终返回的都是整数类型的最大值,没有匹配数据时会默认返回0,和原生SQL效果完全一致
内容的提问来源于stack exchange,提问作者sangio90
相关产品推荐
相关产品推荐

