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

时间:2019-04-01 03:59:03

标签: arrays symfony sorting doctrine php-7.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));

3 个答案:

答案 0 :(得分:0)

对于Doctrine Criteria来说,这似乎是一个很好的用例。它们允许对ArrayCollections进行过滤/排序(如果已经加载了集合,则在内存中),或者通过在下次从数据库加载集合时添加一个WHERE / ORDER BY SQL子句来对ArrayCollections进行过滤/排序。因此,这已经非常优化了!

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

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

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

答案 1 :(得分: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));
}

答案 2 :(得分:0)

对于实体,执行以下操作:向属性添加 OrderBy 注释。

/**
 * @OneToMany(targetEntity="Course")
 * @OrderBy({"live": "ASC"})
 */
private $courses;