doctrine2 按带有 ids 的数组排序

问题描述 投票:0回答:5

我如何使用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

:)

谢谢

php symfony doctrine-orm doctrine-odm doctrine-query
5个回答
7
投票

不需要预排序查询结果的简单解决方案:

 $idPositions = array_flip($userIds); // Mapping of id to position
 usort($users, function($userA, $userB) use ($idPositions) {
     return $idPositions[$userA->id] - $idPositions[$userB->id];
 });

0
投票

如果您使用 MySQL,使用 FIELD() 函数进行排序可以实现此目的。 DQL 没有对此函数的内置支持,因此您必须创建用户定义的函数(请参阅此答案),或创建本机查询。


0
投票

我有一个可能效率很低的解决方案,但它有效。确保您的结果按

id
排序。

$users = $entityManager
    ->getRepository('User')
    ->findById($userIds, ['id' => 'ASC']);

$userIdsCopy = $userIds;
sort($userIdsCopy);
array_multisort($userIds, $userIdsCopy);
array_multisort($userIdsCopy, $users);

很难解释它是如何工作的,但基本上你“记住”对 userId 数组进行排序时发生的操作,然后将相反的操作应用于查询结果。


0
投票

我找到了解决方案,可以使用 FIELD mysql 扩展 https://github.com/beberlei/DoctrineExtensions

谢谢

马克


-1
投票

您想用哪个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
© www.soinside.com 2019 - 2024. All rights reserved.