«Usort» Doctrine \ Common \ Collections \ ArrayCollection?

В разных случаях мне нужно отсортировать Doctrine\Common\Collections\ArrayCollection соответствии с свойством объекта. Не найдя метод, который делает это сразу, я делаю это:

 // $collection instanceof Doctrine\Common\Collections\ArrayCollection $array = $collection->getValues(); usort($array, function($a, $b){ return ($a->getProperty() < $b->getProperty()) ? -1 : 1 ; }); $collection->clear(); foreach ($array as $item) { $collection->add($item); } 

Я предполагаю, что это не лучший способ, когда вам нужно скопировать все в собственный PHP-массив и обратно. Интересно, есть ли лучший способ «уничтожить» Doctrine\Common\Collections\ArrayCollection . Я скучаю по любому документу?

Solutions Collecting From Web of "«Usort» Doctrine \ Common \ Collections \ ArrayCollection?"

Чтобы отсортировать существующую коллекцию, вы ищете метод ArrayCollection :: getIterator (), который возвращает ArrayIterator. пример:

 $iterator = $collection->getIterator(); $iterator->uasort(function ($a, $b) { return ($a->getPropery() < $b->getProperty()) ? -1 : 1; }); $collection = new ArrayCollection(iterator_to_array($iterator)); 

Самый простой способ – позволить обработать запрос в репозитории для сортировки.

Представьте, что у вас есть SuperEntity с отношением ManyToMany к объектам категории.

Затем, например, создав такой метод репозитория:

 // Vendor/YourBundle/Entity/SuperEntityRepository.php public function findByCategoryAndOrderByName($category) { return $this->createQueryBuilder('e') ->where('e.category = :category') ->setParameter('category', $category) ->orderBy('e.name', 'ASC') ->getQuery() ->getResult() ; } 

… делает сортировку довольно простой.

Надеюсь, это поможет.

Начиная с Doctrine 2.3 вы можете использовать API критериев

Например:

 <?php public function getSortedComments() { $criteria = Criteria::create() ->orderBy(array("created_at" => Criteria::ASC)); return $this->comments->matching($criteria); } 

Примечание. Для этого решения требуется публичный доступ к $createdAt или общедоступному методу getter getCreatedAt() .

Если у вас есть поле ArrayCollection, вы можете заказать аннотации. например:

Скажите, что у организации с именем Общество есть много Лицензий. Вы можете использовать

 /** * @ORM\OneToMany(targetEntity="License", mappedBy="society") * @ORM\OrderBy({"endDate" = "DESC"}) **/ private $licenses; 

Это будет упорядочивать ArrayCollection по endDate (поле datetime) в порядке desc.

См. Документацию Doctrine: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#orderby