在使用Doctrine进行了一对多的映射,如一个人(Person),有多个小孩(Children),希望在使用Doctrine自动获取Children时,小孩能按年龄大小排序。
请问:要重载哪个函数才能实现呢?persion->getChildren()调用了哪个函数进行SQL查询呢?
这样的需求,很难搜索到结果,求前辈指点。
在使用Doctrine进行了一对多的映射,如一个人(Person),有多个小孩(Children),希望在使用Doctrine自动获取Children时,小孩能按年龄大小排序。
请问:要重载哪个函数才能实现呢?persion->getChildren()调用了哪个函数进行SQL查询呢?
这样的需求,很难搜索到结果,求前辈指点。
使用 @vinzao 的方式没问题,不过 Doctirne 是提供了 OrderBy
方法的:
Person:
<?php
// src/AppBundle/Entity/Person.php
class Person
{
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Children", mappedBy="person")
* @ORM\OrderBy({"age"="DESC"})
*/
protected $childrens;
}
Children:
<?php
// src/AppBundle/Entity/Children.php
class Children
{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Person", inversedBy="childrens")
*/
protected $person;
}
解决方案如下:
修改
Person
类的getChildren
方法如果不想修改
getChildren
方法,可以写一个新的方法getChildrenOrderedByAge
,道理同上。总结:
Doctrine
的一对多或者多对多关系中,Entity
中所谓多
的属性是Doctrine\Common\Collections\Collection
接口的某一实现的实例,默认情况下是Doctrine\Common\Collections\ArrayCollection
,上述解决方案中用到的就是这一接口的Filtering API
(筛选接口),上述情况下,筛选的条件会最终转化到SQL
层进行处理,以达到性能优化的目的。最后,相关官方文档链接如下:Filtering Collections