Подтвердить что ты не робот

"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-массив и обратно. Интересно, есть ли лучший способ "usort" a Doctrine\Common\Collections\ArrayCollection. Я пропустил какой-либо документ?

4b9b3361

Ответ 1

Чтобы отсортировать существующую коллекцию, вы ищете метод 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 с объектами Category.

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

// 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()
    ;
}

... упрощает сортировку.

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

Ответ 2

Начиная с 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().

Ответ 3

Если у вас есть поле 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