gpt4 book ai didi

php - Symfony2 - 已注册但不存在的自定义 DQL 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:01 32 4
gpt4 key购买 nike

我拼命地尝试在 Symfony2 中包含 LEVENSHTEIN 函数,但是,我仍然收到错误。规范 + 到目前为止我所做的:

  • PostgreSQL 9.3
  • LEVENSHTEIN 包含在 fuzzystrmatch 扩展中
  • 通过 shell 执行测试了功能。工作得很好:

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

    配置.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/... 无法识别函数?非常感谢任何帮助!

最佳答案

错误来自 Postgres,似乎是可见性问题。

附加模块fuzzystrmatch当然,必须安装。您显然已经这样做了,否则您的函数调用也不会在 psql 中工作。

如果它在 psql 中有效,但在您的应用程序中无效,则只剩下一些可能的解释。首先是显而易见的:

  • 你们正在连接到同一个数据库? (相同的服务器,相同的端口,相同的数据库?)

  • 您正在连接同一用户?可能不是 ...

  • 如果连接到不同的用户(但在任何情况下),请检查您是否使用相同的搜索路径。在任一连接中运行并比较:

    SHOW search_path;

    详细信息 - 以及如何设置 search_path:

请注意,扩展可以安装到您选择的任何架构中。默认是 search_path 中的第一个模式(安装时的“当前模式”,通常是 public,但我不知道你的安装情况. 文档:

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

你会得到类似的东西:

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

如果 schema_acl 包含 =U/postgres ( U for USAGE ),则 public 角色具有访问权限,即每个人。

相应地为您的连接设置 search_path 或(重新)安装到一个可见的模式,它应该可以工作。

理论上,所有者角色或 super 用户可能已经撤销了函数本身的EXECUTE 权限...

关于php - Symfony2 - 已注册但不存在的自定义 DQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770962/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com