Symfony,querybuilder,使用pgsql扩展

时间:2014-04-22 18:12:36

标签: php postgresql symfony doctrine

我将createQueryBuilderSymfonyPGSQL一起使用。

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

CREATE EXTENSION unaccent;

但是当我尝试查询时:

                    $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中使用此扩展程序?

2 个答案:

答案 0 :(得分:3)

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

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

# app/config/config.yml
doctrine:
    orm:
        # ...
        dql:
            string_functions:
                unaccent: Your\Namespace\Doctrine\DQL\Unaccent

我们也希望在捆绑配置中自动执行see an example

独立学说

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

$config = new \Doctrine\ORM\Configuration();
$config->addCustomStringFunction('unaccent', 'Your\Namespace\Doctrine\DQL\Unaccent');

答案 1 :(得分:0)

尝试安装Doctrine2扩展程序,它将为您提供所需内容(unaccent表达式):Doctrine2 Extensions