Clé*_*aud 2 php postgresql doctrine symfony
我使用的是createQueryBuilder同Symfony和PGSQL。
我在我的数据库中安装了来自 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 中使用这个扩展?
您可以创建自己的 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)
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |