我正在寻找一种方法来创建一个忽略空格的学说查询。 我尝试使用替换,但我一直收到
预期的已知功能,得到'替换'
我的查询如下:
$query = $em->createQueryBuilder();
$query->select('c')
->from('ACME\UserBudnle\Entity\User', 'c')
->where('replace(c.username," ","")'.' LIKE :searchName')
->setParameter('searchName', '%@' . $searchName. '%')
->orderBy('c.username', 'asc');
答案 0 :(得分:13)
好的我写了一个替换DQL函数。
<?php
namespace Acme\UserBundle\DQL;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
/**
* "REPLACE" "(" StringPrimary "," StringSecondary "," StringThird ")"
*/
class replaceFunction extends FunctionNode{
public $stringFirst;
public $stringSecond;
public $stringThird;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) {
return 'replace('.$this->stringFirst->dispatch($sqlWalker) .','
. $this->stringSecond->dispatch($sqlWalker) . ','
.$this->stringThird->dispatch($sqlWalker) . ')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringFirst = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->stringSecond = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->stringThird = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
接下来在app / config.yml中我添加:
doctrine:
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
dql:
string_functions:
replace: Acme\UserBundle\DQL\replaceFunction
最后我在Controller中创建了一个DQL查询:
$em = $this->getDoctrine()->getManager();
$query = $em->createQueryBuilder();
$query->select('u')
->from('Acme\UserBundle\Entity\User', 'u')
->where("replace(u.username,' ','') LIKE replace(:username,' ','') ")
->setParameter('username', '%' . $usernameForm . '%')
->orderBy('u.username', 'asc');
$result = $query->getQuery()->getResult();
最有趣的是“引号”非常重要。这意味着你可以在select,from,setParameter和orderBy中看到我使用''但在我使用的地方“”和空格''。相反的是没有用。我不知道为什么。