从树枝模板中过滤关系的最佳方法

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 实体/存储库中的示例? 我设法用过滤方法对我的关系做我想做的事情。请参阅我的问题中的更新。

以上是关于从树枝模板中过滤关系的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

从日期到字符串的树枝过滤器

树枝中的 str_replace

使用 Vue JS 从数组中过滤数据的最佳方法是啥?

Symfony2 中的 Twig CamelCase 过滤器

自定义 Symfony2 过滤器未使用自定义树枝标签触发

在树枝中显示科学记数法