【问题标题】:doctrine2 order by array with ids教义2按带有ID的数组排序
【发布时间】: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一起使用

:)

谢谢

【问题讨论】:

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


    【解决方案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 扩展

          谢谢

          马克

          【讨论】:

          【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-21
            • 1970-01-01
            • 2017-05-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多