我如何使用doctrine2通过带有ids的数组进行排序?
我有这样的疑问:
$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
:)
谢谢
不需要预排序查询结果的简单解决方案:
$idPositions = array_flip($userIds); // Mapping of id to position
usort($users, function($userA, $userB) use ($idPositions) {
return $idPositions[$userA->id] - $idPositions[$userB->id];
});
如果您使用 MySQL,使用 FIELD() 函数进行排序可以实现此目的。 DQL 没有对此函数的内置支持,因此您必须创建用户定义的函数(请参阅此答案),或创建本机查询。
我有一个可能效率很低的解决方案,但它有效。确保您的结果按
id
排序。
$users = $entityManager
->getRepository('User')
->findById($userIds, ['id' => 'ASC']);
$userIdsCopy = $userIds;
sort($userIdsCopy);
array_multisort($userIds, $userIdsCopy);
array_multisort($userIdsCopy, $users);
很难解释它是如何工作的,但基本上你“记住”对 userId 数组进行排序时发生的操作,然后将相反的操作应用于查询结果。
您想用哪个id订购?
您可以使用...
->orderBy('u.id', 'asc')
// or n.id
// or c.id
或者你可以使用多个 order by(“by's”对我来说似乎不太合适)...
->addOrderBy('u.id', 'asc')
->addOrderBy('u.name', 'desc') // if it exists