这是使用Doctrine2的WHERE IN表达式处理有序数组的正确方法吗?

时间:2011-03-25 15:39:34

标签: doctrine-orm dql where-in

使用Zend Lucene Search,我将返回一个相关订购ID列表,这些ID映射到我将从数据库中提取的博客记录。

这是使用Doctrine2的WHERE IN表达式处理数组的正确方法:

$dql = "SELECT b FROM BlogPost WHERE b.id IN (" . implode(', ', $ids) . ")";
$query = $em->createQuery($dql);
...

或者是否有更好的方法可以将实际的$ids数组作为参数传递给查询?

此外,Zend Search会根据相关性返回ID数组。 使用上述技术会保留检索博客帖子的相关顺序吗?

2 个答案:

答案 0 :(得分:4)

如果它让你感觉更好,你可以使用ExpressionBuilder。

$ex = $em->getExpressionBuilder();
$dql = 'SELECT b FROM BlogPost b WHERE ' . $ex->in('b.id', $ids));
$query = $em->createQuery($dql);

function cmp($a, $b) {
    global $ids;
    return (array_search($a->getId(), $ids) < array_search($b->getId(), $ids)) ? -1 : 1;
}
usort($res, 'cmp');

它有点干净,但屏幕后面跟你一样。

答案 1 :(得分:1)

你应该通过setParameter()函数传递$ ids数组,因为这是学说中的最佳实践:

$query = $this->_em->createQuery('SELECT b FROM BlogPost WHERE b.id IN (?1)');
$query->setParameter(1, implode(',', $ids));

我认为IN语句不会保留传递的ID的顺序,因为IN将匹配第一个找到的$ id,而不依赖于顺序。