2015-11-18 16 views
5

Tôi đang tuyệt vọng cố gắng đưa hàm LEVENSHTEIN vào trong Symfony2, tuy nhiên, tôi vẫn nhận được lỗi. Thông số kỹ thuật + những gì tôi đã làm như vậy cho đến nay:Symfony2 - Chức năng DQL tùy chỉnh đã đăng ký nhưng không tồn tại

  • PostgreSQL 9,3
  • Levenshtein bao gồm trong phần mở rộng fuzzystrmatch
  • Tested chức năng thông qua thực hiện vỏ. Làm việc hoàn toàn tốt đẹp:

    postgres=# SELECT levenshtein('test', 'text'); 
    levenshtein 
    ------------- 
          1 
    (1 row) 
    
  • gia tăng các chức năng trong 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 
    
  • Vấn đề: Khi thực hiện codeblock sau trong Repository của tôi , các lỗi sau xảy ra:

    $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

tôi thiếu gì? Tại sao DQL/Symfony/PDO/... không nhận ra chức năng? Bất kỳ sự trợ giúp nào cũng được đánh giá cao!

Trả lời

1

Lỗi đến từ Postgres, có vẻ như vấn đề với khả năng hiển thị.

Mô-đun bổ sung fuzzystrmatch phải được cài đặt, tất nhiên. Bạn rõ ràng đã làm điều đó, hoặc cuộc gọi chức năng của bạn sẽ không hoạt động trong psql hoặc.

Nếu nó hoạt động trong psql, nhưng không phải trong ứng dụng của bạn, chỉ có một vài giải thích có thể vẫn tồn tại. Đầu tiên rõ ràng:

  • Bạn được kết nối với cơ sở dữ liệu giống nhau không? (Cùng một máy chủ, cùng một cổng, cùng một db?)

  • Bạn đang kết nối với cùng một người dùng? Có lẽ không phải ...

  • Nếu kết nối với người dùng khác (nhưng trong mọi trường hợp), hãy kiểm tra xem bạn có đang làm việc cùng một đường dẫn tìm kiếm không. Chạy trong cả hai kết nối và so sánh:

    SHOW search_path; 
    

    chi tiết - và làm thế nào để thiết lập search_path:

Hãy nhận biết rằng phần mở rộng có thể được cài đặt vào bất kỳ sơ đồ của lựa chọn của bạn. Mặc định là giản đồ đầu tiên trong (các "schema hiện tại" search_path tại thời điểm cài đặt, thường là public, nhưng tôi không biết rằng về việc cài đặt của bạn Các tài liệu:.

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

Run này để chẩn đoán một vài điều:

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 

Bạn nhận được một cái gì đó như:

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

Nếu schema_acl bao gồm =U/postgres (U for USAGE), sau đó vai trò public có quyền truy cập, nghĩa là tất cả mọi người.

Đặt search_path cho kết nối của bạn cho phù hợp hoặc (lại) cài đặt vào giản đồ hiển thị và nó sẽ hoạt động.

Về mặt lý thuyết, vai trò sở hữu hoặc superuser có thể thu hồi giấy phép EXECUTE từ chức năng riêng của mình ...

1

Lớp chức năng của bạn có vẻ ổn với tôi, nhưng cấu hình của bạn có thể sai. Đây là những gì tôi có cho chức năng CAST tôi:

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

Bạn nên lưu ý rằng bạn có bộ sưu tập khác nhau cho các loại khác nhau của chức năng ví dụ string_functions, numeric_functions, datetime_functions. Tất cả chúng được liệt kê trong chính thức documentation.

Ngoài ra, mã của bạn sẽ hoạt động tốt sau khi bạn xóa bộ nhớ cache.

Các vấn đề liên quan