有没有办法为Doctrine 2模型指定默认顺序?

时间:2012-04-01 22:55:59

标签: sorting doctrine-orm

在Rails中(甚至在Doctrine< 2,IIRC中),您可以为任何模型指定默认顺序。例如,如果您告诉Rails始终按customer订购name表格,则Customer.all将始终按name订购的客户列表。它具有很大的意义。

从我收集到的内容中,不可能在Doctrine 2中执行此操作。显然,他们希望您create a query代替。

在我看来,这将是一个非常干燥,逻辑和方便的功能,并且选择遗漏的一个非常愚蠢的功能。

我真诚地希望我错误地认为这个选项不存在,在我今晚哭泣自己睡觉之前,我想检查一下Doctrine是否确实有办法指定一个默认订单而我还没有能够找到它。谁能开导我?

6 个答案:

答案 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'));