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

Posted

技术标签:

【中文标题】这是使用 Doctrine2 的 WHERE IN 表达式处理有序数组的正确方法吗?【英文标题】:Is this the proper way to handle an ordered array with Doctrine2's WHERE IN expression? 【发布时间】:2011-07-23 00:37:50 【问题描述】:

使用 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 数组。 使用上述技术是否会在检索博客文章时保留相关顺序?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢,我更喜欢这样。使用 DQL 保留 ID 顺序的任何想法? 不,我不认为这是可能的。您要么必须按照您想要的顺序逐一阅读它们,要么之后对它们进行排序。 (我用一个例子编辑了我原来的答案) 我现在很确定这是不可能的。您可以在 SQL 中执行以下操作:“select * from table order by (case id when 3 then 0 when 1 then 1 when 4 then 2 end)”但是Doctrine2中尚不支持CaseExpression,它不起作用。 你可以依赖use这样的关键字,而不是声明一个全局变量,这不是一个好习惯:function cmp($a, $b) use($ids) 【参考方案2】:

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

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

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

【讨论】:

只返回一个结果。 我刚刚测试过,你是对的,它只返回一个值。可悲的是,我想将此报告为错误,但 jira 已关闭。

以上是关于这是使用 Doctrine2 的 WHERE IN 表达式处理有序数组的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2 WHERE IN 子句使用实体集合

在 Doctrine 2 中执行 WHERE .. IN 子查询

嵌套在 Doctrine2 中的位置

在子数组上使用“where”和“in”时出现续集错误

如何在 Linq 的 Where 条件中使用 IN 运算符

LaravelDB查询 where 例子记录