32

我有一个带有此属性的实体“容器”

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

该属性是一个数组集合...

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

...使用这两种标准方法

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

4 回答 4

73

您应该能够使用@ORM\OrderBy语句,它允许您指定列以对集合进行排序:

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

事实上,这可能是OneToMany/ManyToOne 上的 How to OrderBy 的副本

编辑

检查实施建议,您似乎必须使用集合查询获取表,以便 @ORM\OrderBy 注释工作:http ://www.krueckeberg.org/notes/d2.html

这意味着您必须在存储库中编写一个方法来返回包含内容表的容器。

于 2013-01-11T16:07:57.087 回答
23

如果您想确保始终根据当前属性值按顺序获取关系,您可以执行以下操作:

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

例如,如果您更改了 Order 属性,请使用它。也适用于“最后修改日期”。

于 2015-05-05T13:25:53.863 回答
15

你可以写

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

用于多个标准排序。

于 2016-01-12T21:22:27.310 回答
1

你也可以像这样ArrayCollectionCriteria属性排序orderBy

<?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();
        }
    }
?>
于 2019-03-14T04:16:22.270 回答