2013-03-27 8 views
22

ho creato la mia funzione DQL personalizzata per Dottrina DQL:Symfony 2/Doctrine Il parametro delle funzioni DQL definito dall'utente ha un limite di lunghezza della stringa?

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

Sembra funzionare bene quando lo si utilizza.

Ma se il parametro stringa contiene più di 307 caratteri, non funziona. Non c'è nessun errore ma lo script sta finendo.

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

Come posso utilizzare più di 307 caratteri?

+2

Hai provato a correre solo SQL con più di 307 caratteri? Forse è un problema nella dimensione massima della query. –

+3

Sì, e non ci sono limiti. – Seb33300

+0

E se io modifico la mia funzione DQL (Traduci classe) di mettere direttamente la mia stringa, sta funzionando: $ query = "translate ('stringa crudo con più di 307 caratteri di lavoro', 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY')"; – Seb33300

risposta

2

Come già spiegato da wrikken, la traslitterazione dovrebbe essere eseguita utilizzando iconv dato che questo salverà le risorse del server.

Ecco una semplice funzione che consente di convertire (convertire i caratteri non latini nelle loro rappresentazioni più vicine in charset latino) una stringa.

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

Sopra uscita la volontà di seguito:

café 
cafe 
Problemi correlati