我有一个带有此属性的实体“容器”
/**
* @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;
答案 0 :(得分:61)
您应该能够使用@ORM\OrderBy语句,该语句允许您指定列以对集合进行排序:
/**
* @ORM\OneToMany(targetEntity="BizTV\ContentManagementBundle\Entity\Content", mappedBy="container")
* @ORM\OrderBy({"sort_order" = "ASC"})
*/
private $content;
实际上这可能是How to OrderBy on OneToMany/ManyToOne
的副本检查实现建议,似乎必须使用连接查询将表提取到集合中,以使@ORM \ OrderBy批注起作用:http://www.krueckeberg.org/notes/d2.html
这意味着您必须在存储库中编写一个方法,以返回带有连接的内容表的容器。
答案 1 :(得分:19)
如果您想确保始终根据当前属性值在订单中获得关系,可以执行以下操作:
$sort = new Criteria(null, ['Order' => Criteria::ASC]);
return $this->yourCollectionProperty->matching($sort);
例如,如果您更改了Order属性,请使用它。适用于“最后修改日期”。
答案 2 :(得分:13)
你可以写
@ORM\OrderBy({"date" = "ASC", "time" = "ASC"})
用于多个标准排序。
答案 3 :(得分:1)
您还可以按ArrayCollection
属性Criteria
对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();
}
}
?>