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

Symfony/PHP升级后Doctrine查询中LOWER函数失效求助

问题排查与解决思路

针对你升级Symfony/PHP/PostgreSQL后,带LOWER的Doctrine查询无响应的问题,给你几个实际可试的排查方向:

1. 用Doctrine表达式生成器重构查询

你当前拼接字符串的写法在Doctrine版本升级后可能触发解析异常,建议换成标准表达式写法,同时把参数小写处理移到PHP层:

$lowerKeyword = mb_strtolower($yourKeyword, 'UTF-8');
$qb->where($qb->expr()->like('LOWER(i.title)', ':keyWord'))
   ->setParameter('keyWord', "%{$lowerKeyword}%", \Doctrine\DBAL\Types\Types::STRING);

或者更简单,直接在PHP层转小写,DQL里去掉LOWER:

$lowerKeyword = mb_strtolower($yourKeyword, 'UTF-8');
$qb->where('i.title LIKE :keyWord')
   ->setParameter('keyWord', "%{$lowerKeyword}%");

2. 显式绑定参数类型

升级后Doctrine对参数类型校验更严格,未指定类型可能导致PostgreSQL处理LOWER时执行计划异常,绑定参数时务必指定类型:

$qb->setParameter('keyWord', '%' . $yourKeyword . '%', \Doctrine\DBAL\Types\Types::TEXT);

同时可以查看PostgreSQL慢查询日志,确认Doctrine执行的prepared statement是否有全表扫描等超时情况。

3. 彻底清理所有缓存

即使你已经清过缓存,也可能遗漏Doctrine专用缓存:

  • 清理Symfony缓存:php bin/console cache:clear --env=prod(生产环境)
  • 清理Doctrine元数据缓存:php bin/console doctrine:cache:clear-metadata
  • 清理Doctrine查询缓存:php bin/console doctrine:cache:clear-query
  • 重启PHP-FPM/Apache(如果开启了OPcache)

4. 检查PostgreSQL排序规则

如果数据库升级到17后改用了不区分大小写的排序规则(如en_US.utf8_ci),无需用LOWER做模糊匹配,直接写i.title LIKE :keyWord即可,还能利用索引提升性能。

5. 排查PHP 8.3字符串处理差异

PHP 8.3可能调整了mbstring默认配置,显式指定编码避免转小写异常:

$lowerKeyword = mb_strtolower($yourKeyword, 'UTF-8');

同时检查php.ini里的mbstring.default_charset是否设为UTF-8。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:44