Doctrine2将函数应用于查询参数

时间:2013-01-30 15:11:24

标签: doctrine-orm

我使用doctrine查询构建器来构建我的查询。

$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select(array('u'))->from('Account', 'a');

-- problem here
$qb->where('lower_unaccent(u.email) LIKE :search');
$qb->setParameter('search', $search['search'] . '%');

这很好用,但我还想将lower_unaccent函数应用于搜索参数。

有没有办法在查询构建器中执行此操作? 因为当我LOWER_UNACCENT(u.email) LIKE LOWER_UNACCENT(:search)时,我收到以下错误:

Error: Expected Doctrine\ORM\Query\Lexer::T_STRING, got 'LOWER_UNACCENT'

即使我将LOWER_UNACCENT更改为LOWER,也会收到相同的错误消息。

2 个答案:

答案 0 :(得分:0)

您必须使用$qb->expr()->lower('u.email')$qb->expr()->lower(':search')。要创建“LIKE”,请将这些作为参数传递给$qb->expr()->like()

虽然似乎没有一种不显眼的方法,但也许有一种方法可以自定义它。让我知道它是怎么回事。

编辑:

查看lower()的代码,看起来你可以使用你想要的任何函数:

new Expr\Func('LOWER', array($x));

答案 1 :(得分:-1)

默认情况下,我很确定你无法做到这一点 lower_unaccent不是标准SQL,据我所见,Doctrine不支持。

您可以做的是使用用户定义的函数扩展DQL,这将执行您想要的任何操作。实施起来并不难。这是一些文档:

http://docs.doctrine-project.org/en/2.0.x/cookbook/dql-user-defined-functions.html

http://docs.doctrine-project.org/en/2.0.x/reference/dql-doctrine-query-language.html#adding-your-own-functions-to-the-dql-language