Reputation: 7566
I created my custom DQL function for Doctrine 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);
}
}
It seems to work well when using it.
But if the string parameter contains more than 307 chars, it is not working. There is no error but the script is ending.
$query = $this->createQueryBuilder('...');
$query->addSelect("TRANSLATE('less than 307 chars')"); // working
$query->addSelect("TRANSLATE('more than 307 chars')"); // NOT working
How can I use more than 307 chars?
Upvotes: 22
Views: 2314
Reputation: 934
Like wrikken had already explained, Transliteration should be done using iconv since that will save your server resources.
here's a simple function that will transliterate (convert non latin characters to their closest representations in latin charset) a string.
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;
}
Usage:
$string = "café";
echo $string;
echo transliterateString($string);
Above will output the below:
café
cafe
Upvotes: 2