2015-11-18 21 views
5

Symfony2にLEVENSHTEIN関数を追加しようとしていますが、まだエラーが発生します。私はこれまで何をやったかスペック+:Symfony2 - 登録されたカスタムDQL関数が存在しない

  • PostgreSQLは9.3
  • レーベンシュタインは、シェルの実行を介した機能をテスト済みfuzzystrmatch拡張
  • に含まれています。完全に正常に動作します:

    postgres=# SELECT levenshtein('test', 'text'); 
    levenshtein 
    ------------- 
          1 
    (1 row) 
    
  • はDQLに機能を追加しました:

    <?php 
    
    namespace AppBundle\DQL; 
    
    use Doctrine\ORM\Query\AST\Functions\FunctionNode; 
    use Doctrine\ORM\Query\Lexer; 
    use Doctrine\ORM\Query\Parser; 
    use Doctrine\ORM\Query\SqlWalker; 
    
    class LevenshteinFunction extends FunctionNode { 
    
        public $firstStringExpression = null; 
    
        public $secondStringExpression = null; 
    
        public function getSql(SqlWalker $sqlWalker) { 
         return 'LEVENSHTEIN(' . $this->firstStringExpression->dispatch($sqlWalker) . ', ' . $this->secondStringExpression->dispatch($sqlWalker) . ')'; 
        } 
    
        public function parse(Parser $parser) { 
         // levenshtein(str1, str2) 
         $parser->match(Lexer::T_IDENTIFIER); 
         $parser->match(Lexer::T_OPEN_PARENTHESIS); 
         $this->firstStringExpression = $parser->StringPrimary(); 
         $parser->match(Lexer::T_COMMA); 
         $this->secondStringExpression = $parser->StringPrimary(); 
         $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
        } 
    } 
    

    Config.yml

    orm: 
        auto_generate_proxy_classes: "%kernel.debug%" 
        auto_mapping: true 
        dql: 
         numeric_functions: 
          LEVENSHTEIN: AppBundle\DQL\LevenshteinFunction 
    
  • 問題:私のリポジトリで、次のコードブロックを実行します次のエラーが発生します。

    $this->getEntityManager()->createQuery("SELECT LEVENSHTEIN('test', 'text') FROM AppBundle:User"); 
    return $query->getResult(); 
    

    SQLSTATE[42883]: Undefined function: 7 ERROR: function levenshtein(unknown, unknown) does not exist

私は何をしないのですか?なぜDQL/Symfony/PDO/...がその機能を認識していないのですか?どんな助けも高く評価されます!

答えて

1

エラーはPostgresに由来し、可視性に問題があるようです。

追加モジュールfuzzystrmatchをインストールする必要があります。あなたは明らかにそれをしました、あるいはあなたの関数呼び出しはpsqlでもうまくいきませんでした。

それはpsqlではなく、自分のアプリで動作する場合、唯一のいくつかの可能な説明が残ります。明らかに最初:

  • あなたは、同じデータベースに接続ですか? (同じサーバー、同じポート、同じデータベース?)

  • あなたは同じユーザーと接続していますか?おそらくではない ...

  • 異なるユーザーと接続している場合(ただしいずれの場合も)、同じ検索パスを使用しているかどうかを確認してください。拡張子は、任意のスキーマにインストールすることができることに注意してください

: - :どちらかの接続で実行し、比較し、どのようにsearch_pathを設定する

SHOW search_path; 

詳細あなたの選択。デフォルトは通常publicで、インストールの際、でsearch_path(「現在のスキーマ」の最初のスキーマですが、私は知らない、あなたのインストールに関するドキュメント:。

If not specified, and the extension's control file does not specify a schema either, the current default object creation schema is used.

を実行し、これに物事のカップルを診断:

SELECT e.extname AS extension, nsp.nspname AS schema 
    , r.rolname AS schema_owner, nsp.nspacl AS schema_acl 
FROM pg_extension e 
JOIN pg_namespace nsp ON nsp.oid = e.extnamespace 
JOIN pg_roles  r ON r.oid = nsp.nspowner 

次のようなものを得る:schema_aclはが含まれている場合

extension | schema | schema_owner |    schema_acl 

---------------+------------+--------------+------------------------------------- 
adminpack  | pg_catalog | postgres  | {postgres=UC/postgres,=U/postgres} 
plpgsql  | pg_catalog | postgres  | {postgres=UC/postgres,=U/postgres} 
fuzzystrmatch | public  | postgres  | {postgres=UC/postgres,=UC/postgres} 
tablefunc  | public  | postgres  | {postgres=UC/postgres,=UC/postgres} 
... 

を(U for USAGE)の場合、publicロールにはアクセス権があります。

接続に応じてsearch_pathを設定するか、表示されているスキーマに(再)インストールしてください。正常に動作するはずです。

は理論的に、所有している役割やスーパーは...

機能自体から EXECUTE許可を取り消されている場合があります
1

あなたの関数のクラスはわかりましたが、設定が間違っている可能性があります。これは私が私のCAST機能のために持っているものです。

doctrine: 
    orm: 
     dql: 
      string_functions: 
       CAST: App\MyBundle\Doctrine\DBAL\Functions\Porgres\Cast 

あなたは機能、すなわちstring_functionsnumeric_functionsdatetime_functionsの種類ごとに異なるコレクションを持っていることに注意してください。それらのすべては公式documentationに記載されています。

それ以外の場合は、キャッシュをクリーンアップした後にコードが正しく動作するはずです。

関連する問題