这是使用 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 表达式处理有序数组的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章