在不同的控制器中以不同的方式订购Doctrine manyToOne集合

时间:2013-12-27 21:36:51

标签: php symfony doctrine-orm

将Synfony2与Doctrine一起使用,我有一个Entity(比如Country),与另一个有一个ManyToOne(比如City)关系。 我使用@ORM \ OrderBy注释告诉Doctrine默认情况下如何获取关联。

我想在页面中显示按名称排序的城市,在另一个页面中按大小显示,所以我希望两个控制器中的orderBy不同。 有没有办法告诉Doctrine代理对象在运行时保湿时应该使用的orderby规则?

我目前的工作解决方案是在存储库中有两种不同的方法来获取City并在DQL中设置ORDER BY。这个解决方案的缺点是我必须在我的twig模板中将Country和City数组作为两个参数,如果设计者使用country.cities而不是cities参数,它将失败:

$country = ...
$cities = $this->getDoctrine()->getRepository("MyBundle:City")->findFromCountryOrderedBySize($country);
return $this->render('MyBundle:Section1:index.html.twig', array(
    'country'=>$country,
    'cities'=>$cities
));

2 个答案:

答案 0 :(得分:1)

当我需要更好地控制结果集时,我将使用QueryBuilder。 repo对于快速findOneBy()调用很有用,但是当你有一个更大的WHERE子句和多个orderBy定义时则不行。

$qb = $this->getDoctrine()->createQueryBuilder();
$query = $qb->select('c')
   ->from('City', 'c')
   ->orderBy('c.size')
   ->getQuery();

$cities = $query->getResult();

文档在这里:http://apigen.juzna.cz/doc/doctrine/doctrine2.git/class-Doctrine.ORM.QueryBuilder.html

答案 1 :(得分:0)

在我的存储库类中,我总是返回QueryBuilder,所以在我的控制器或模型管理器类中,我可以调整查询,而不是进行大量非常具体的查询。

我通过Form Component Entity Type转向了这一点,这要求你提供一个QueryBuilder来完成它的工作。

在QueryBuilder上设置orderBy将覆盖以前设置的任何orderBy。您可以使用默认订单,然后在特定用例中覆盖它,或使用addOrderBy补充QueryBuilder提供的默认订单。让生活变得更加混乱。