Symfony,querybuilder,使用 pgsql 的扩展

Clé*_*aud 2 php postgresql doctrine symfony

我使用的是createQueryBuilderSymfonyPGSQL

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

CREATE EXTENSION unaccent;
Run Code Online (Sandbox Code Playgroud)

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

                    $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();
Run Code Online (Sandbox Code Playgroud)

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

我如何在 Symfony 和 Doctrine 中使用这个扩展?

Jul*_*tré 5

您可以创建自己的 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

你必须在学说配置中注册它

使用 Symfony

根据这里的文档

# app/config/config.yml
doctrine:
    orm:
        # ...
        dql:
            string_functions:
                unaccent: Your\Namespace\Doctrine\DQL\Unaccent
Run Code Online (Sandbox Code Playgroud)

我们也喜欢在 bundle 配置中自动做,看一个例子

与学说独立

根据教义文件(未测试):

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