首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony,querybuilder,使用pgsql的扩展

Symfony,querybuilder,使用pgsql的扩展
EN

Stack Overflow用户
提问于 2014-04-23 02:12:36
回答 2查看 1.5K关注 0票数 2

我将createQueryBuilderSymfonyPGSQL一起使用。

我在我的数据库中安装了来自PGSQL的扩展unaccent:

代码语言:javascript
复制
CREATE EXTENSION unaccent;

但是当我尝试这样的查询时:

代码语言:javascript
复制
                    $qb = $this->_em->createQueryBuilder();
                    $qb->select(array('a'))
                    ->from('ProjectBundle:Account', 'a')
                    ->where('unaccent(a.firstname) LIKE unaccent(?1) OR unaccent(a.lastname) LIKE unaccent(?1)')
                    ->setParameters(array(1 => '%'.$search.'%'))
                    ->setMaxResults(5);
            return $qb->getQuery()->getResult();

我有这个错误:Error: Expected known function, got unaccent

如何将此扩展与Symfony和Doctrine一起使用?

EN

回答 2

Stack Overflow用户

发布于 2015-01-05 04:54:18

您可以创建自己的DQL函数来支持Unaccent:

代码语言:javascript
复制
namespace Your\Namepsace\Doctrine\DQL;

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

/**
 * Unaccent string using postgresql extension unaccent : 
 * http://www.postgresql.org/docs/current/static/unaccent.html
 * 
 * Usage : StringFunction UNACCENT(string)
 *
 */
class Unaccent extends FunctionNode
{
    private $string;

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

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

        $this->string = $parser->StringPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

}

你必须在规则配置中注册它。

与Symfony的

根据to the doc here的说法:

代码语言:javascript
复制
# app/config/config.yml
doctrine:
    orm:
        # ...
        dql:
            string_functions:
                unaccent: Your\Namespace\Doctrine\DQL\Unaccent

我们也喜欢在捆绑配置中自动完成,see an example

采用单机版

根据to the doctrine documentation (未测试):

代码语言:javascript
复制
$config = new \Doctrine\ORM\Configuration();
$config->addCustomStringFunction('unaccent', 'Your\Namespace\Doctrine\DQL\Unaccent');
票数 5
EN

Stack Overflow用户

发布于 2014-04-23 02:34:35

尝试安装Doctrine2扩展,它将为您提供所需的内容(无重音表达式):Doctrine2 Extensions

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23227177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档