Symfony 2 / Doctrine ユーザー定義の DQL 関数のパラメータには文字列の長さ制限がありますか? 質問する

Symfony 2 / Doctrine ユーザー定義の DQL 関数のパラメータには文字列の長さ制限がありますか? 質問する

Doctrine DQL 用のカスタム 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);
    }
}

使用してみるとうまく機能しているようです。

ただし、文字列パラメータに 307 文字以上が含まれている場合は機能しません。エラーは発生しませんが、スクリプトは終了します。

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

307 文字以上を使用するにはどうすればよいですか?

ベストアンサー1

wrikken がすでに説明したように、サーバーのリソースを節約するために、文字変換は iconv を使用して行う必要があります。

文字列を音訳 (非ラテン文字をラテン文字セットの最も近い表現に変換) する簡単な関数を次に示します。

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

使用法:

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

上記の出力は以下のようになります:

café
cafe

おすすめ記事