doctrine2 - symfony中使用Doctrine一对多映射在取对应Entity数组时的如何先排序?
本文介绍了doctrine2 - symfony中使用Doctrine一对多映射在取对应Entity数组时的如何先排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在使用Doctrine进行了一对多的映射,如一个人(Person),有多个小孩(Children),希望在使用Doctrine自动获取Children时,小孩能按年龄大小排序。
请问:要重载哪个函数才能实现呢?persion->getChildren()调用了哪个函数进行SQL查询呢?
这样的需求,很难搜索到结果,求前辈指点。
解决方案
解决方案如下:
修改Person
类的getChildren
方法
<?php
// src/AppBundle/Entity/Person.php
// ...
use Doctrine\Common\Collections\Criteria;
//...
/**
* @param string $orderedByAge "ASC"|"DESC"
*/
public function getChildren($orderedByAge=null)
{
if (null === $orderedByAge) {
return $this->children;
}
if (!in_array(strtoupper($orderedByAge), ['ASC', 'DESC'])) {
throw new \InvalidArgumentException('参数错误,必须是"ASC"或"DESC"中的一个');
}
$order = 'ASC' === $orderedByAge ? Criteria::ASC : Criteria::DESC;
$criteria = Criteria::create()->orderBy(['age' => $order]);
return $this->children->matching($criteria);
}
// ...
如果不想修改getChildren
方法,可以写一个新的方法getChildrenOrderedByAge
,道理同上。
总结:
Doctrine
的一对多或者多对多关系中,Entity
中所谓多
的属性是Doctrine\Common\Collections\Collection
接口的某一实现的实例,默认情况下是Doctrine\Common\Collections\ArrayCollection
,上述解决方案中用到的就是这一接口的Filtering API
(筛选接口),上述情况下,筛选的条件会最终转化到SQL
层进行处理,以达到性能优化的目的。
最后,相关官方文档链接如下:Filtering Collections
这篇关于doctrine2 - symfony中使用Doctrine一对多映射在取对应Entity数组时的如何先排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文