Symfony QueryBuilder处理带重音字符参数报错求助
问题解决:Symfony QueryBuilder带重音字符的语法错误
问题根源
你直接将带重音的名字(比如Rémy)拼接成了QueryBuilder的参数名(:firstNameRémy),但SQL的参数标识符不允许包含重音这类特殊字符,这直接导致了语法解析错误。
修复方案
用循环索引代替名字作为参数名的后缀,确保参数名是合法的SQL标识符:
if (!empty($firstNames)) { $orConditions = $qb->expr()->orX(); foreach ($firstNames as $index => $firstName) { // 用索引生成合法的参数名 $paramName = ':firstName_' . $index; $orConditions->add( $qb->expr()->like('LOWER(ip.firstName)', $paramName) ); $qb->setParameter($paramName, '%' . mb_strtolower($firstName, 'UTF-8') . '%'); } $qb->andWhere($orConditions); }
额外优化(重音字符匹配问题)
如果后续遇到输入无重音字符却匹配不到带重音的名字(比如输入remy找不到Rémy),可以根据你的数据库类型做进一步处理:
- PostgreSQL:先安装
unaccent扩展,然后修改查询逻辑,去除字符串中的重音后再比较:$orConditions->add( $qb->expr()->like('LOWER(UNACCENT(ip.firstName))', $paramName) ); $qb->setParameter($paramName, '%' . mb_strtolower(trim($firstName), 'UTF-8') . '%'); - MySQL:可以使用
utf8mb4_general_ci排序规则(该规则会忽略重音进行字符串比较),或者用CONVERT函数转换为无重音形式:$orConditions->add( $qb->expr()->like('LOWER(CONVERT(ip.firstName USING ascii))', $paramName) ); $qb->setParameter($paramName, '%' . mb_strtolower(trim($firstName), 'UTF-8') . '%');
内容的提问来源于stack exchange,提问作者Venerivagus
相关产品推荐
相关产品推荐

