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

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)

  • 请参阅http://stackoverflow.com/a/17416974/6681下面的答案,了解如何使其更加通用和灵活. (3认同)

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专注于具有关系的对象模型.那里有很多基于活跃记录的替代品.

回答你的问题:不.

  • 在Symfony 2.1中使用此方法,我得到无法识别的字段:0,带有` - > findBy(array(),array('field_to_sort_on'))`.要解决此问题,需要将字段作为数组键,将方向作为数组值:` - > findBy(array(),array('field_to_sort_on'=>'ASC'))` (15认同)

小智 23

我有同样的问题,我发现覆盖findAll()你的Repository中的函数效果很好:

public function findAll()
{
    return $this->findBy(array(), array('lft'=>'asc'));  
}
Run Code Online (Sandbox Code Playgroud)


Jrg*_*gns 8

实现此目的的一种相对简单的方法是覆盖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如果需要,也可以这样做.


Jas*_*ett 6

看起来不行,没有办法在Doctrine 2中指定默认顺序.