Doctrine orm 这是处理Doctrine2表达式中WHERE的有序数组的正确方法吗?

Doctrine orm 这是处理Doctrine2表达式中WHERE的有序数组的正确方法吗?,doctrine-orm,dql,where-in,Doctrine Orm,Dql,Where In,使用Zend-Lucene搜索,我将返回一个关联有序ID列表,这些ID映射到我将从数据库中获取的博客记录 这是处理Doctrine2表达式中WHERE的数组的正确方法吗: $dql = "SELECT b FROM BlogPost WHERE b.id IN (" . implode(', ', $ids) . ")"; $query = $em->createQuery($dql); ... 或者是否有更好的方法将实际的$ids数组作为参数传递给查询 此外,Zend搜索根据相关性返回

使用Zend-Lucene搜索,我将返回一个关联有序ID列表,这些ID映射到我将从数据库中获取的博客记录

这是处理Doctrine2表达式中WHERE的数组的正确方法吗:

$dql = "SELECT b FROM BlogPost WHERE b.id IN (" . implode(', ', $ids) . ")";
$query = $em->createQuery($dql);
...
或者是否有更好的方法将实际的$ids数组作为参数传递给查询


此外,Zend搜索根据相关性返回ID数组。使用上述技术是否会保留检索博客文章的相关性顺序?

您应该通过setParameter函数对$ids数组进行pas,因为这是原则中的最佳实践:

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

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

如果它让您感觉更好,您可以使用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');

它有点干净,但在屏幕后面的效果与您相同。

这只返回一个结果。我刚刚测试了它,您是对的,它只返回一个值。不幸的是,我想报告这是一个错误,但jira已关闭。谢谢,我更喜欢它。有没有关于用DQL保存ID顺序的想法?没有,我认为这是不可能的。你要么按照你想要的顺序一个接一个地阅读它们,要么在之后对它们进行排序。我用一个例子编辑了我的原始答案,现在我很确定这是不可能的。您可以在SQL中执行以下操作:从表顺序中按大小写id选择*当3、0、1、1、4、2结束时,但Doctrine2中还不支持CaseExpression,它不起作用。与其声明一个不好的全局变量,不如依赖如下use关键字:函数cmp$a、$b use$ids{}。