64

さまざまなケース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 配列にコピーして戻す必要がある場合、これは最善の方法ではないと思います。a を「usort」するより良い方法があるのだろうかDoctrine\Common\Collections\ArrayCollection。見逃しているドキュメントはありますか?

4

6 に答える 6

61

Doctrine 2.3以降、Criteria APIを使用できます

例えば:

<?php

public function getSortedComments()
{
    $criteria = Criteria::create()
      ->orderBy(array("created_at" => Criteria::ASC));

    return $this->comments->matching($criteria);
}

注: このソリューションには、$createdAtプロパティまたはパブリック getter メソッドへのパブリック アクセスが必要getCreatedAt()です。

于 2014-06-16T14:44:57.743 に答える
29

ArrayCollection フィールドがある場合は、注釈を付けて注文できます。例えば:

Society という名前のエンティティが多くのライセンスを持っているとします。あなたが使用することができます

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

これにより、ArrayCollection が endDate (datetime フィールド) の降順で並べられます。

Doctrine のドキュメントを参照してください: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#orderby

于 2015-10-29T22:15:14.600 に答える
0

すべての値を取得し、これらの値を並べ替えてから、並べ替えた値でプロパティを上書きするのはどうですか?

public function sortMyDateProperty(): void
{
    $values = $this->myAwesomeCollection->getValues();
    usort($values, static function (MyAwesomeInterface $a, MyAwesomeInterface $b): int {
        if ($a->getMyDateProperty()->getTimestamp() === $b->getMyDateProperty()->getTimestamp()) {
            return 0;
        }

        return $a->getMyDateProperty() > $b->getMyDateProperty() ? 1 : -1;
    });

    $this->myAwesomeCollection = new ArrayCollection($values);
}
于 2021-12-20T16:06:43.803 に答える
0

@annotations のない最後の Symfony 5.3 では、必要なのは

...
#[OrderBy(['sortOrder' => 'ASC'])]
private Collection $collection;

#[Column(type: 'integer')]
private int $sortOrder = 0;
...

あなたのエンティティで

于 2021-11-24T12:20:33.517 に答える