2013-03-27 34 views
22

tworzę niestandardową funkcję DQL do nauki DQL:Symfony 2/Doctrine zdefiniowane przez użytkownika parametry funkcji DQL mają ograniczenie długości łańcucha?

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

wydaje się działać dobrze podczas korzystania z niego.

Ale jeśli parametr ciągu zawiera więcej niż 307 znaków, to nie działa. Nie ma błędu, ale skrypt się kończy.

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

Jak mogę użyć więcej niż 307 znaków?

+2

próbowałeś uruchomić tylko SQL z więcej niż 307 znaków? Może to problem w maksymalnym rozmiarze zapytania. –

+3

Tak, i nie ma ograniczeń. – Seb33300

+0

A jeśli zmodyfikować moje funkcję DQL (Przetłumacz klasę), aby bezpośrednio umieścić mój łańcuch, to działa: $ query = „translate («surowy ciąg z więcej niż 307 znaków pracy»,«àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ»,«AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY»)”; – Seb33300

Odpowiedz

2

Jak już wyjaśnił wrikken, transliteracja powinna być wykonana za pomocą iconv, ponieważ pozwoli to zaoszczędzić zasoby serwera.

Oto prosta funkcja, która będzie transliterować (konwertować znaki nie łacińskie na ich najbliższe reprezentacje w łacińskim zestawie znaków) ciąg znaków.

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

Zastosowanie:

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

Nad wyjściem będzie poniżej:

café 
cafe