1

在我的 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",因此显然它没有“看到”方法:ids_string中的select()

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

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

编辑 2我已经放弃并将裸数据放入select()通话中(我想避免)。这行得通,但随后有必要实施 Koc 的建议,即使用 HIDDEN关键字来防止 Doctrine 返回array(Object i, array(fixed_order)),而不仅仅是Object i

4

2 回答 2

0

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

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

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

于 2012-12-07T09:50:05.487 回答
0

从 Doctrine 2.2 开始,您可以将HIDDEN关键字用于 avability 字段,以便按顺序排列而不用水化它们。

尝试:

->select('i, FIELD(i.id, :ids_string) AS HIDDEN fixed_order')
于 2012-12-03T19:46:38.957 回答