如何通过带有ID的数组使用doctrine2命令?
我有这个问题:
$qb = $this->createQueryBuilder('u')
->select('u', 'n', 'c')
->leftJoin('u.notifications', 'n')
->leftJoin('u.channel', 'c')
->andWhere('u.id IN (:ids)')
->setParameter('ids', $ids);
我希望结果与带有id的数组具有相同的顺序,是否可以这样做?
由于
SOLUTION:
将FIELD mysql扩展名与https://github.com/beberlei/DoctrineExtensions
一起使用:)
由于
答案 0 :(得分:5)
不需要预先排序查询结果的简单解决方案:
$idPositions = array_flip($userIds); // Mapping of id to position
usort($users, function($userA, $userB) use ($idPositions) {
return $idPositions[$userA->id] - $idPositions[$userB->id];
});
答案 1 :(得分:0)
如果您使用MySQL,sorting with the FIELD()功能可以实现此目的。 DQL没有对此函数的内置支持,因此您必须create a user defined function(请参阅this answer)或创建本机查询。
答案 2 :(得分:0)
我的解决方案可能非常低效,但它确实有效。确保您的结果按id
排序。
$users = $entityManager
->getRepository('User')
->findById($userIds, ['id' => 'ASC']);
$userIdsCopy = $userIds;
sort($userIdsCopy);
array_multisort($userIds, $userIdsCopy);
array_multisort($userIdsCopy, $users);
很难解释这是如何运作的,但基本上你是"记得"排序userId-array时发生的操作,然后将相反的操作应用于查询结果。
答案 3 :(得分:-1)
您想要订购哪个ID?
你可以使用......
->orderBy('u.id', 'asc')
// or n.id
// or c.id
或者你可以使用多个订单("' s"对我来说似乎不对)...
->addOrderBy('u.id', 'asc')
->addOrderBy('u.name', 'desc') // if it exists
答案 4 :(得分:-1)