使用Synfony2和Doctrine,我有一个实体(比如国家),与另一个实体有ManyToOne(比如城市)的关系。我使用 @ORM\OrderBy 注释来告诉 Doctrine 默认情况下如何获取关联。
我想在一个页面中显示按名称排序的城市,在另一个页面中按大小排序,所以我希望顺序在两个控制器中有所不同。有没有办法告诉 Doctrine 代理对象在运行时补水时应该使用的按顺序规则?
我目前的工作解决方案是在存储库中使用两种不同的方法来获取城市并在 DQL 中设置 ORDER BY。此解决方案的缺点是我必须在树枝模板中将国家/地区和城市数组作为两个参数,如果设计器使用 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
));
当我需要对结果集进行更精细的控制时,我将使用 QueryBuilder。存储库非常适合快速查找OneBy()调用,但当您具有较大的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
在我的存储库类中,我总是返回一个 QueryBuilder,因此在我的控制器或模型管理器类中,我可以将查询调整为恰到好处,而不是有大量非常具体的查询。
表单组件实体类型让我对此进行了修改,它要求您为其提供查询构建器来完成它的工作。
在 QueryBuilder 上设置 orderBy 将覆盖以前设置的任何 orderBy。您可以在特定用例中覆盖默认 orderBy 然后覆盖它,或者使用 addOrderBy 来补充 QueryBuilder 提供的默认顺序。让生活变得不那么混乱。