在Rails中(甚至在Doctrine< 2,IIRC中),您可以为任何模型指定默认顺序。例如,如果您告诉Rails始终按customer
订购name
表格,则Customer.all
将始终按name
订购的客户列表。它具有很大的意义。
从我收集到的内容中,不可能在Doctrine 2中执行此操作。显然,他们希望您create a query代替。
在我看来,这将是一个非常干燥,逻辑和方便的功能,并且选择遗漏的一个非常愚蠢的功能。
我真诚地希望我错误地认为这个选项不存在,在我今晚哭泣自己睡觉之前,我想检查一下Doctrine是否确实有办法指定一个默认订单而我还没有能够找到它。谁能开导我?
答案 0 :(得分:35)
虽然您似乎无法为整个模型ala Doctrine 1执行此操作,但您可以在关系的反面指定排序作为符号:
// Entity/Category
/**
* @var ArrayCollection $posts
*
* @ORM\OneToMany(targetEntity="Post", mappedBy="category")
* @ORM\OrderBy({"name" = "ASC"})
*/
private $posts;
此外,如果您正在实施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);
}
}
答案 1 :(得分:28)
$items = $entityManager()->getRepository('Item')->findBy(array(),array('field_to_sort_on'));
当然,您只需将方法添加到Item存储库
即可public function findAllWithDefaultSort()
{
return $this->findBy(array(),array('default_field_to_sort_on'));
}
在这种情况下,不需要进行查询。请记住,D2专注于具有关系的对象模型。那里有很多基于活跃记录的替代品。
回答你的问题:不。
答案 2 :(得分:23)
我有同样的问题,我发现覆盖存储库中的findAll()
函数的效果非常好:
public function findAll()
{
return $this->findBy(array(), array('lft'=>'asc'));
}
答案 3 :(得分:8)
实现此目的的一种相对简单的方法是覆盖Entity的存储库类中的findBy
方法:
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);
}
}
这为所有findBy方法添加了默认排序,并允许您在需要时覆盖排序。如果需要,findOneBy
也可以这样做。
答案 4 :(得分:6)
看起来不行,没有办法在Doctrine 2中指定默认顺序。
答案 5 :(得分:3)
findBy的参数1是搜索条件,参数2是orderby,似乎需要采用ASC(升序)或DESC(降序)
$accounts = $this->em->getRepository('Entities\User')
->findBy(array('active' => 1), array('email' => 'ASC'));