从树枝模板中过滤关系的最佳方法
Posted
技术标签:
【中文标题】从树枝模板中过滤关系的最佳方法【英文标题】:Best way to filter a relationship from a twig template 【发布时间】:2013-09-10 21:30:24 【问题描述】:在我的 Symfony2 项目中,我有两个实体:Spot 和 Weather,两个实体之间存在一对多关系“weatherReports”。
有些天气报告已经过时,所以我想创建一个“activeWeatherRecords”方法来过滤 Spot 实体中的 Weather 实体。
很遗憾,我不知道该怎么做。这个想法不是从控制器中获取对象,因为 Spot 对象被收藏,链接到用户对象并直接从树枝模板访问。
那么问题来了:直接是什么?
2013 年 9 月 11 日更新
我设法用我的关系过滤方法过滤了我的关系。
在我的现场实体中,我声明了一个 getActiveWeatherRecords() 方法:
public function getActiveWeatherReports()
// Date
$date = new \DateTime(date('Y-m-d 12:00:00', time()));
// Criteria
$criteria = Criteria::create()
->where(Criteria::expr()->gte("date", $date))
->orderBy(array("date" => Criteria::ASC))
;
return $this->weatherReports->matching($criteria);
我可以从树枝模板中调用此方法,如下所示:
[...]
% for weatherReport in spot.activeWeatherReports %
[...]
% endfor %
[...]
【问题讨论】:
为什么不直接删除过时的报告?您可以创建简单的垃圾收集器命令并按计划运行它。在该命令中删除超过 X 天的报告。 我想保留这些报告并将它们用于统计,无法真正删除它们。 您的报告实体有日期吗?您可以比较树枝中的日期 - twig.sensiolabs.org/doc/functions/date.html。您可以使用它仅显示最近的报告 报告实体确实有一个日期,但会有数千个,所以我无法循环每个都知道哪个是最近的。 如何选择要显示的报告? 【参考方案1】:一种方法是创建一个仅获取活动记录的查找器方法。您可以将该方法放在 Doctrine 存储库中,从您的控制器(或 Service Layer)调用它并将其传递给您的模板。
另一种方法是为您的实体添加filtering method 权限。这样您就不必调用单独的方法并将结果传递给模板——传递给实体的实体就足够了。
【讨论】:
我认为向我的收藏添加过滤条件是我一直在寻找的东西,你用过吗?我在哪里可以找到如何将它正确集成到我的 Symfony2 实体/存储库中的示例? 我设法用过滤方法对我的关系做我想做的事情。请参阅我的问题中的更新。以上是关于从树枝模板中过滤关系的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章