Jas*_*ett 23 sorting doctrine-orm
在Rails中(甚至在Doctrine <2,IIRC中),您可以为任何模型指定默认顺序.例如,如果你告诉Rails总是命令你customer的表name,Customer.all将永远被客户订购的列表name.它具有很大的意义.
从我收集的内容来看,它无法在Doctrine 2中执行此操作.显然,他们希望您创建一个查询.
在我看来,这将是一个非常干燥,逻辑和方便的功能,并且选择遗漏的一个非常愚蠢的功能.
我真诚地希望我错误地认为这个选项不存在,在我今晚哭泣自己睡觉之前,我想检查一下Doctrine是否真的有办法指定一个默认订单我只是无法找到它.任何人都可以开导我吗?
Ste*_*eve 36
虽然您似乎无法为整个模型ala Doctrine 1执行此操作,但您可以在关系的反面指定排序作为符号:
// Entity/Category
/**
* @var ArrayCollection $posts
*
* @ORM\OneToMany(targetEntity="Post", mappedBy="category")
* @ORM\OrderBy({"name" = "ASC"})
*/
private $posts;
Run Code Online (Sandbox Code Playgroud)
此外,如果您正在实现SonataNewsBundle中的实体管理器服务,您可以通过可选参数指定默认值,即
class PostManager extends ModelPostManager
{
/**
* {@inheritDoc}
*/
public function findBy(array $criteria, array $orderBy = array('name' => 'asc'))
{
return $this->em->getRepository($this->class)->findBy($criteria, $orderBy);
}
}
Run Code Online (Sandbox Code Playgroud)
Cer*_*rad 28
$items = $entityManager()->getRepository('Item')->findBy(array(),array('field_to_sort_on'));
Run Code Online (Sandbox Code Playgroud)
当然,您只需向Item存储库添加一个方法即可
public function findAllWithDefaultSort()
{
return $this->findBy(array(),array('default_field_to_sort_on'));
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不需要进行查询.请记住,D2专注于具有关系的对象模型.那里有很多基于活跃记录的替代品.
回答你的问题:不.
小智 23
我有同样的问题,我发现覆盖findAll()你的Repository中的函数效果很好:
public function findAll()
{
return $this->findBy(array(), array('lft'=>'asc'));
}
Run Code Online (Sandbox Code Playgroud)
实现此目的的一种相对简单的方法是覆盖findByEntity的repository类中的方法:
class MyEntityRepository extends EntityRepository
{
/**
* @inheritdoc
*/
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
$orderBy = $orderBy === null ? array('added' => 'desc') : $orderBy;
return parent::findBy($criteria, $orderBy, $limit, $offset);
}
}
Run Code Online (Sandbox Code Playgroud)
这为所有findBy方法添加了默认排序,并允许您在需要时覆盖排序.findOneBy如果需要,也可以这样做.