我将createQueryBuilder
与Symfony
和PGSQL
一起使用。
我在我的数据库中用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中使用此扩展程序?
答案 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 ,
# 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