带有ids的数组的doctrine2顺序

时间:2014-05-23 16:41:37

标签: symfony doctrine-orm doctrine-odm doctrine-query

如何通过带有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

一起使用

:)

由于

5 个答案:

答案 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)

我找到了解决方案,可以使用带有https://github.com/beberlei/DoctrineExtensions

的FIELD mysql扩展

由于

马克

相关问题