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

Seb*_*300 22 php doctrine dql symfony doctrine-orm

我为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它在使用时似乎运行良好.

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

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

我如何使用超过307个字符?

dns*_*hio 2

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

\n\n

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

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

用法:

\n\n
$string = "caf\xc3\xa9"; \necho $string;\necho transliterateString($string);\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面将输出以下内容:

\n\n
caf\xc3\xa9\ncafe\n
Run Code Online (Sandbox Code Playgroud)\n