22 votos

Symfony 2 / Doctrina definida por el usuario DQL funciones parámetros tienen una longitud de cadena de límite?

He creado mi costumbre DQL función para la Doctrina de la 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);
    }
}

Parece que funciona bien cuando se utiliza.

Pero si el parámetro de cadena contiene más de 307 caracteres, que no está funcionando. No hay ningún error, pero el guión está terminando.

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

¿Cómo puedo utilizar más de 307 chars?

2voto

killneel Puntos 151

Como wrikken ya se explicó, la Transcripción debe ser realizada con iconv, ya que va a ahorrar los recursos de tu servidor.

he aquí una sencilla función que se transcriben (convertir caracteres no latinos para sus más cercanos representaciones en latín charset) una cadena.

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

Uso:

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

Por encima de salida será el siguiente:

café
cafe

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X