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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:03:22