how to sort an entity's arrayCollection in symfony2

后端 未结 4 1718
借酒劲吻你
借酒劲吻你 2021-02-01 15:33

I have an entity \"container\" with this property

/**
 * @ORM\\OneToMany(targetEntity=\"BizTV\\ContentManagementBundle\\Entity\\Content\", mappedBy=\"container\"         


        
相关标签:
4条回答
  • 2021-02-01 16:10

    You can write

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

    for multiple criteria ordering.

    0 讨论(0)
  • 2021-02-01 16:12

    If you want to be sure that you always get your relations in the order based on current property values, you can do something like this:

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

    Use that for example if you've changed the Order property. Works great for a "Last modified date" as well.

    0 讨论(0)
  • 2021-02-01 16:18

    You can also sort ArrayCollection by Criteria property orderBy like so:

    <?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();
            }
        }
    ?>
    
    0 讨论(0)
  • 2021-02-01 16:20

    You should be able to use the @ORM\OrderBy statement which allows you to specify columns to order collections on:

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

    In fact this may be a duplicate of How to OrderBy on OneToMany/ManyToOne

    Edit

    Checking for implementation advice it appears that you must fetch the tables with a join query to the collection in order for the @ORM\OrderBy annotation to work: http://www.krueckeberg.org/notes/d2.html

    This means that you must write a method in the repository to return the container with the contents table joined.

    0 讨论(0)
提交回复
热议问题