按特定的自定义字段对Doctrine ArrayCollection进行排序

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

我试图按特定字段对ArrayCollection进行排序。 ArrayCollection是一系列课程。在Course实体中有一个名为isLive的方法,它返回一个布尔值。

我想对这个集合进行排序,以便在数组的开头有“实时”课程,这样就是从true调用返回isLive的课程。

这是我目前的代码,但$sorted数组中的第一个条目是非实时课程。

$iterator = $this->courses->getIterator();
$iterator->uasort(function ($a, $b) {
   if ($a->isLive() == $b->isLive()) {
      return 0;
   }
   return ($a->isLive() < $b->isLive()) ? -1 : 1;
});
$sorted = new ArrayCollection(iterator_to_array($iterator));
arrays symfony sorting doctrine php-7.2
2个回答
0
投票

它看起来像Doctrine Criteria的一个很好的用例。如果集合已经加载,它们允许在内存中对ArrayCollections进行过滤/排序,方法是在下次从数据库加载集合时添加WHERE / ORDER BY SQL子句。所以这非常优化!

代码应该看起来像这样,假设你在live后面有一个isLive()字段:

$criteria = Criteria::create()
    ->orderBy(["live" => Criteria::DESC])
;

$sorted = $this->courses->matching($criteria);

0
投票

我得到了一个使用uasortarray_search的解决方案,如下所示:

/**
 * @return ArrayCollection
 */
public function getCoursesSortedByLive(): ArrayCollection
{
    $coursesIterator = $this->courses->getIterator();

    $sortOrder = [true];

    $coursesIterator->uasort(function ($a, $b) use ($sortOrder) {
        return array_search($a->isLive(), $sortOrder) - array_search($b->isLive(), $sortOrder);
    });

    return new ArrayCollection(iterator_to_array($sitesIterator));
}
© www.soinside.com 2019 - 2024. All rights reserved.