教义2按带有ID的数组排序
Posted
技术标签:
【中文标题】教义2按带有ID的数组排序【英文标题】:doctrine2 order by array with ids 【发布时间】:2014-07-13 02:55:39 【问题描述】:我怎样才能通过 ids 的数组来对学说 2 进行排序?
我有这个问题:
$qb = $this->createQueryBuilder('u')
->select('u', 'n', 'c')
->leftJoin('u.notifications', 'n')
->leftJoin('u.channel', 'c')
->andWhere('u.id IN (:ids)')
->setParameter('ids', $ids);
我希望结果与带有 ids 的数组具有相同的顺序,可以吗?
谢谢
解决方案:
将 FIELD mysql 扩展与https://github.com/beberlei/DoctrineExtensions一起使用
:)
谢谢
【问题讨论】:
【参考方案1】:不需要对查询结果进行预排序的简单解决方案:
$idPositions = array_flip($userIds); // Mapping of id to position
usort($users, function($userA, $userB) use ($idPositions)
return $idPositions[$userA->id] - $idPositions[$userB->id];
);
【讨论】:
【参考方案2】:如果您使用 MySQL,sorting with the FIELD() 函数可以完成此操作。 DQL 没有对此函数的内置支持,因此您要么必须create a user defined function(请参阅this answer),要么创建一个本机查询。
【讨论】:
【参考方案3】:我有一个可能非常低效的解决方案,但它确实有效。确保您的结果按id
排序。
$users = $entityManager
->getRepository('User')
->findById($userIds, ['id' => 'ASC']);
$userIdsCopy = $userIds;
sort($userIdsCopy);
array_multisort($userIds, $userIdsCopy);
array_multisort($userIdsCopy, $users);
很难解释这是如何工作的,但基本上你会“记住”对 userId 数组进行排序时发生的操作,然后将相反的操作应用于查询结果。
【讨论】:
【参考方案4】:我找到了解决方案,可以使用带有https://github.com/beberlei/DoctrineExtensions 的 FIELD mysql 扩展
谢谢
马克
【讨论】:
这是一个如何在 Symfony 中注册这个 DQL 函数以及如何使用它的示例,以防万一你也在使用 MySQL:ourcodeworld.com/articles/read/1162/…【参考方案5】:您想通过哪个 id 订购?
你可以使用...
->orderBy('u.id', 'asc')
// or n.id
// or c.id
或者您可以使用多个 order by's(“by's”对我来说似乎不正确)...
->addOrderBy('u.id', 'asc')
->addOrderBy('u.name', 'desc') // if it exists
【讨论】:
以上是关于教义2按带有ID的数组排序的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中使用空值对 JSON 数组进行排序