Сортировка ArrayCollection Doctrine по определенному настраиваемому полю - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь отсортировать 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));

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Я получил решение с использованием uasort и array_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));
}
0 голосов
/ 01 апреля 2019

Это хороший пример использования Doctrine Criteria .Они позволяют фильтровать / сортировать ArrayCollections, либо в памяти, если коллекция уже загружена, либо путем добавления предложения SQL WHERE / ORDER BY в следующий раз, когда коллекция будет загружена из базы данных.Так что это довольно оптимизировано!

Код должен выглядеть примерно так, при условии, что у вас есть поле live позади isLive():

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

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