web-dev-qa-db-ja.com

symfony2でエンティティのarrayCollectionをソートする方法

このプロパティを持つエンティティ「コンテナ」があります

/**
 * @ORM\OneToMany(targetEntity="BizTV\ContentManagementBundle\Entity\Content", mappedBy="container")
 */
private $content;

プロパティは配列コレクションです...

public function __construct() {
    $this->content = new \Doctrine\Common\Collections\ArrayCollection();
}

...これらの2つの標準的な方法で

/**
 * Add content
 *
 * @param BizTV\ContentManagementBundle\Entity\Content $content
 */
public function addContent(\BizTV\ContentManagementBundle\Entity\Content $content)
{
    $this->content[] = $content;
}

/**
 * Get content
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getContent()
{
    return $this->content;
}

さて、私の質問は、おそらくgetContent()呼び出しで、これにソート機能を組み込むスムーズな方法がありますか?私はphp wizではありませんし、symfony2に慣れていないことは確かですが、私は行くにつれて学びます。

コンテンツエンティティ自体には、次のようにソートするINTがあります。

/**
 * @var integer $sortOrder
 *
 * @ORM\Column(name="sort_order", type="integer")
 */
private $sortOrder; 
30
Matt Welander

@ ORM\OrderBy ステートメントを使用して、コレクションを並べ替える列を指定できるようにする必要があります。

/**
 * @ORM\OneToMany(targetEntity="BizTV\ContentManagementBundle\Entity\Content", mappedBy="container")
 * @ORM\OrderBy({"sort_order" = "ASC"})
 */
private $content;

実際、これは OneToMany/ManyToOneでのOrderByの方法 の複製である可能性があります

編集

実装のアドバイスを確認すると、@ ORM\OrderByアノテーションが機能するためには、コレクションへの結合クエリでテーブルをフェッチする必要があるようです: http://www.krueckeberg.org/notes/d2.html

これは、コンテンツテーブルが結合されたコンテナを返すメソッドをリポジトリに記述する必要があることを意味します。

63
Luke

現在のプロパティ値に基づいた順序でリレーションを常に取得したい場合は、次のようなことができます。

$sort = new Criteria(null, ['Order' => Criteria::ASC]);
return $this->yourCollectionProperty->matching($sort);

たとえば、Orderプロパティを変更した場合に使用します。 「最終更新日」にも最適です。

19

あなたは書ける

@ORM\OrderBy({"date" = "ASC", "time" = "ASC"})

複数の基準の順序付けのため。

ArrayCollectionプロパティCriteriaorderByをソートすることもできます:

<?php
    namespace App/Service;

    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Criteria;

    /**
     * Class SortService
     *
     * @package App\Service
     */
    class SortService {
        /**
         * @param SomeAbstractObject $object
         * @return SomeCollectionItem[]
         */
        public function sorted(SomeAbstractObject $object): array {
            /** $var ArrayCollection|SomeCollectionItem[] */
            $collection = $object->getCollection();

            // convert normal array to array collection object
            if(\is_array(collection)) {
                $collection = new ArrayCollection(collection);
            }

            // order collection items by position property
            $orderBy = (Criteria::create())->orderBy([
                'position' => Criteria::ASC,
            ]);

            // return sorter SomeCollectionItem array
            return $collection->matching($orderBy)->toArray();
        }
    }
?>
1
HelpNeeder