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



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

这并没有按正确的顺序返回它们,所以我认为我需要使用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",因此显然它没有在select()方法中"看到":ids_string

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

EDIT 1我知道我可以将基本数据直接放入select()调用中。

EDIT 2我已经放弃了,将裸数据放入select()调用(我想避免)。这起到了作用,但后来有必要实施Koc的建议,即使用HIDDEN关键字来防止条令返回array(Object i, array(fixed_order))而不仅仅是Object i

从条令2.2中,您可以按顺序使用可用性字段的HIDDEN关键字,而无需水合它们。

尝试:

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

当你注意到这个问题时,你会后悔的。。。

试着重读你的句子:"很明显,它没有在select()方法中"看到">:ids_string"。

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

相关内容

  • 没有找到相关文章

最新更新