gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:50:25 25 4
gpt4 key购买 nike

我为 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 个字符?

最佳答案

就像 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

关于php - Symfony 2/Doctrine 用户定义的 DQL 函数参数有字符串长度限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15657953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com