3

soundex関数を登録しようとすると、次のようになります。

[構文エラー]行0、列106:エラー:文字列の終わりが必要です。「SOUNDEX」を取得しました

クラス定義:

use Doctrine\ORM\Query\AST\Functions\FunctionNode;

/**
 * SoundexFunction ::= "SOUNDEX" "(" StringPrimary  ")"
 */
class SoundexFunction extends FunctionNode
{
    public $stringExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->$stringExpression = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);

    }
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'SOUNDEX(' .
            $this->$stringExpression->dispatch($sqlWalker) .
        ')';
    }
}

config.ymlスニペット:

orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    entity_managers:
      default:
        auto_mapping: true
        dql:
          string_functions:
            soundex: Mana\ClientBundle\DQL\SoundexFunction

クエリ関数:

protected function getMatches($incoming) {
    $em = $this->getDoctrine()->getManager();
    $fname = $incoming['fname'];
    $sname = $incoming['sname'];
    $sql = "select id, active, fname, sname, dob, phys_addr, phys_city
        from ManaClientBundle:Client where SOUNDEX(fname) = SOUNDEX(:fname) and
        SOUNDEX(sname) = SOUNDEX(:sname)
        order by sname, fname";
    $query = $em->createQuery($sql)
        ->setParameters(array(
            'fname' => $fname,
            'sname' => $sname,
        ));
    return $query->getResult();
}
4

1 に答える 1

2

ジオ、なぜそれがあなたのために働いていないのかわかりません。QueryBuilderで試してみたところ、うまくいきました。ただし、の使用法をに置き換える必要があり$this->$stringExpressionました$this->stringExpression

編集:

ベアアプリケーションでコードをテストしましたが、問題はSOUNDEXではなく、SQLにあります。エンティティにSQLエイリアスを割り当ててみてください。

$sql = "select client.id, client.active, client.fname, client.sname, client.dob, client.phys_addr, client.phys_city
        from ManaClientBundle:Client client where SOUNDEX(client.fname) = SOUNDEX(:fname) and
        SOUNDEX(client.sname) = SOUNDEX(:sname)
        order by client.sname, client.fname";
于 2013-01-14T01:21:49.330 に答える