如何在Query Builder select()方法中将参数传递给Doctrine2自定义函数?

时间:2012-12-03 18:05:43

标签: symfony doctrine-orm symfony-2.1 query-builder

在我的Symfony2项目中,我正从Elasticsearch索引中检索一组有序的实体ID。然后,我将此列表传递给Doctrine2,以通过WHERE IN()调用来检索实际实体。

这不会以正确的顺序返回它们,因此我认为我需要使用特定于MySQL的FIELD()函数。我已经创建了一个自定义DQL函数来实现这个功能。

所以现在我使用以下代码构建一个Doctrine查询对象,但参数未被解析为select()方法:

$itemIds = array(4,8,2,1);

$this->getRepository()
    ->createQueryBuilder('i')
        ->select('i, FIELD(i.id, :ids_string) AS HIDDEN fixed_order')
        ->where('i.id IN (:ids)')
        ->setParameters(array(
            'ids_string' => implode(',', $itemIds),
            'ids' => $itemIds))
        ->orderBy('fixed_order', 'ASC')
    ->getQuery()
;

此操作失败并显示错误"Invalid parameter number: number of bound variables does not match number of tokens",因此显然它没有“看到”:ids_string方法中的select()

我最初尝试将FIELD()函数放在orderBy()调用中,但看起来它不会被解析为自定义DQL函数调用,我想我会遇到同样的问题问题如上。

编辑1 我知道我可以将基础数据直接放入select()来电。

编辑2 我已放弃并将裸数据放入select()调用(我想避免)。这很有效,但是有必要实现Koc建议使用HIDDEN关键字来阻止Doctrine返回array(Object i, array(fixed_order))而不仅仅是Object i

2 个答案:

答案 0 :(得分:0)

从Doctrine 2.2开始,您可以按顺序使用HIDDEN关键字来保存可用性字段。

尝试:

->select('i, FIELD(i.id, :ids_string) AS HIDDEN fixed_order')

答案 1 :(得分:0)

当你发现问题时,你会踢自己......

尝试重读你的句子:“所以显然它不是”在select()方法中“看到”:ids_string “。

然后仔细查看您的代码:'id_string' => implode(',',$ itemIds)