В разных случаях мне нужно отсортировать 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
. Я скучаю по любому документу?
Чтобы отсортировать существующую коллекцию, вы ищете метод 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
или общедоступному методу gettergetCreatedAt()
.
Если у вас есть поле 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