2013-03-27 16 views
22

Ich habe meine benutzerdefinierte DQL Funktion für Lehre DQL:Symfony 2/Doctrine benutzerdefinierte DQL-Funktionen Parameter haben String-Längenbeschränkung?

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 es zu benutzen.

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?

+2

Haben Sie versucht, nur zu laufen mit mehr als 307 Zeichen SQL? Vielleicht ist es ein Problem bei der maximalen Abfragegröße. –

+3

Ja, und es gibt keine Einschränkung. – Seb33300

+0

Und wenn ich meine DQL-Funktion (Translate-Klasse) modifiziere, um meine Zeichenkette direkt zu setzen, funktioniert sie: $ query = "TRANSLATE ('rohe Zeichenkette mit mehr als 307 Zeichen', 'àâäãáåÀÁÄÄÇÇéèêëÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ" ",' AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY ')"; – Seb33300

Antwort

2

Wie wrikken bereits erklärt hatte, sollte Transliteration mit iconv durchgeführt werden, da dies Ihre Serverressourcen sichert.

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

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

Verbrauch:

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

Above ausgeben wird die folgende Liste:

café 
cafe 
Verwandte Themen