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

发布于 2024-10-27 01:37:20 字数 384 浏览 3 评论 0原文

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

Using Zend Lucene Search, I am returning a list of relevance-ordered IDs that map to blog records that I will fetch from the database.

Is this the proper way of handling an array with Doctrine2's WHERE IN expression:

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

Or is there a better way of maybe passing in the actual $ids array as a parameter to the query?

Also, the Zend Search returns the array of IDs based on relevance. Will using the above technique preserve the order of relevance in retrieving the blog posts?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃颗糖壮壮胆 2024-11-03 01:37:20

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

它更干净一些,但与屏幕后面的情况相同。

If it makes you feel better, you can use the 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');

It's a bit cleaner, but does the same as you behind the screens.

猫九 2024-11-03 01:37:20

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

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

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

You should pas the $ids array through setParameter() function as this is a best practice in doctrine:

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

I think the IN statement will not preserve the order of the passed ID's as IN will match the first found $id not depending on the order.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文