/ / Symfony 2 / Doctrine benutzerdefinierte DQL-Funktionen Parameter haben String-Längenbeschränkung? - php, symfony, doctrine2, Lehre, dql

Symfony 2 / Doctrine benutzerdefinierte DQL-Funktionen Parameter haben String-Längenbeschränkung? - php, symfony, doctrine2, Lehre, dql

Ich habe meine benutzerdefinierte DQL-Funktion für Doctrine DQL erstellt:

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);
}
}

Es scheint gut zu funktionieren, wenn man es benutzt.

Aber wenn der String-Parameter mehr als 307 Zeichen enthält, funktioniert es nicht. Es gibt keinen Fehler, aber das Skript endet.

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

Wie kann ich mehr als 307 Zeichen verwenden?

Antworten:

2 für die Antwort № 1

Wie schon bei wrikken erklärt, sollte Transliteration mit iconv durchgeführt werden, da dies Ihre Serverressourcen speichert.

Hier ist eine einfache Funktion, die eine Zeichenkette transkribiert (nicht lateinische Zeichen in ihre nächstgelegenen Darstellungen im lateinischen Zeichensatz konvertiert).

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;
}

Verwendung:

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

Oben wird folgendes ausgegeben:

café
cafe