it-swarm.com.de

So sortieren Sie die arrayCollection einer Entität in symfony2

Ich habe eine Entität "Container" mit dieser Eigenschaft

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

die Eigenschaft ist eine Array-Sammlung ...

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

... mit diesen beiden Standardmethoden

/**
 * 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;
}

Nun meine Frage ist, gibt es eine reibungslose Möglichkeit, eine Sortierfunktion in diese zu integrieren, vielleicht beim Aufruf von getContent ()? Ich bin kein PHP-Experte und schon gar nicht in Symfony2 erfahren, aber ich lerne, wie ich gehe.

Die Inhaltsentität selbst hat eine Sortier-INT wie diese, nach der ich sie sortieren möchte:

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

Sie sollten in der Lage sein, die Anweisung @ ORM\OrderBy zu verwenden, mit der Sie Spalten angeben können, in denen Sammlungen nach folgenden Kriterien sortiert werden sollen:

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

Tatsächlich kann dies ein Duplikat von How to OrderBy bei OneToMany/ManyToOne sein

Bearbeiten

Wenn Sie nach Implementierungshinweisen suchen, müssen Sie die Tabellen mit einer Verknüpfungsabfrage in die Auflistung abrufen, damit die Anmerkung @ORM\OrderBy funktioniert: http://www.krueckeberg.org/notes/d2.html)

Dies bedeutet, dass Sie eine Methode in das Repository schreiben müssen, um den Container mit dem verknüpften Inhaltsverzeichnis zurückzugeben.

63
Luke

Wenn Sie sicherstellen möchten, dass Ihre Beziehungen immer in der Reihenfolge angezeigt werden, in der sie auf den aktuellen Eigenschaftswerten basieren, können Sie Folgendes tun:

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

Verwenden Sie dies beispielsweise, wenn Sie die Order-Eigenschaft geändert haben. Funktioniert auch hervorragend für ein "Datum der letzten Änderung".

19

Du kannst schreiben

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

für mehrere Kriterien bestellen.

Sie können ArrayCollection auch wie folgt nach Criteria Eigenschaft orderBy sortieren:

<?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