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个字符?
就像 wrikken 已经解释的那样,音译应该使用 iconv 完成,因为这将节省您的服务器资源。
\n\n这是一个简单的函数,它将音译(将非拉丁字符转换为拉丁字符集中最接近的表示形式)字符串。
\n\nfunction 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} \nRun Code Online (Sandbox Code Playgroud)\n\n用法:
\n\n$string = "caf\xc3\xa9"; \necho $string;\necho transliterateString($string);\nRun Code Online (Sandbox Code Playgroud)\n\n上面将输出以下内容:
\n\ncaf\xc3\xa9\ncafe\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2094 次 |
| 最近记录: |