Symfony 2 / Doctrine 用户定义的 DQL 函数参数有字符串长度限制吗?

2022-08-30 19:21:38

我为 Doctrine DQL 创建了我的自定义 DQL 函数:

class Translate extends FunctionNode {
    public $field;

    public function getSql(SqlWalker $sqlWalker) {
        $query = "TRANSLATE(" . $this->field->dispatch($sqlWalker) . ", 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY')";
        return $query;
    }

    public function parse(Parser $parser) {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->field = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

使用它时似乎效果很好。

但是,如果字符串参数包含的字符超过 307 个字符,则它不起作用。没有错误,但脚本即将结束。

$query = $this->createQueryBuilder('...');
$query->addSelect("TRANSLATE('less than 307 chars')"); // working
$query->addSelect("TRANSLATE('more than 307 chars')"); // NOT working

如何使用超过 307 个字符?


答案 1

就像wrikken已经解释的那样,音译应该使用iconv来完成,因为这将节省你的服务器资源。

这里有一个简单的函数,它将音译(将非拉丁字符转换为拉丁字符集中最接近的表示形式)一个字符串。

function transliterateString($str)
{
    $serverLocale = setlocale(LC_CTYPE, 0);
    setlocale(LC_CTYPE, 'en_US.UTF8');
    // transliterate the string using iconv
    $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); 
    setlocale(LC_CTYPE, $serverLocale); //  return the locale to what it was before
    return $str;
}   

用法:

$string = "café"; 
echo $string;
echo transliterateString($string);

以上将输出以下内容:

café
cafe

答案 2

推荐