教义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的数组排序的主要内容,如果未能解决你的问题,请参考以下文章

mysql按带有数组键的字符串排序[重复]

在 JavaScript 中使用空值对 JSON 数组进行排序

按层次结构和名称对具有层次结构的对象数组进行排序

带有多个属性的对象的打字稿排序数组

使用 Realm 和 NSPredicate 按数组索引排序

按对象字段对对象数组进行排序