【问题标题】:How to access entity functions with parameters in TWIG - symfony2如何在 TWIG 中使用参数访问实体函数 - symfony2
【发布时间】:2013-11-08 16:40:37
【问题描述】:

我的 Symfony2 项目中有一个树枝模板。 在树枝模板中,我有一个实体对象。 此实体对象通过 oneToMany 关系链接到另一个实体。

例子:

{{ submission }} -> Submission entity
{{ submission.histories }} -> Histories entity -> I have here an array collection of histories

实体历史有一个字段“state_to”

我的目标是只获取 state_to 为 4 的历史记录对象

我试过这样:

{{ submission.histories('status_to', 4)[0] }}

但这不起作用。

我知道我可以使用:

{% for history in submission.histories %}
    {% if history.statusTo == 4 %}
        {{ history.statusDate|date("d F Y") }}
    {% endif %}
{% endfor %}

但我确信有更好的方法。

【问题讨论】:

  • 好吧,而不是从数据库中获取所有实体并尝试在模板中过滤它们......您应该创建一个存储库方法来仅获取具有 history.statusTo = 4 的那些并将它们传递给模板.这样的逻辑不应该包含在模板中。
  • 好主意@nifr,为你+1。

标签: php symfony doctrine-orm entity twig


【解决方案1】:

在您的实体中添加一个方法 getHistoryByStatus($status) 以根据 status_to 字段过滤您的历史记录,然后在您的模板中:

{% set filtered_history = submission.historyByStatus(4)|default(false) %}
{% if filtered_history %}
    {{ filtered_history.statusDate|date("d F Y") }}
{% endif %}

【讨论】:

  • entity 中的方法仍将获取所有相关历史记录(因为您需要在此方法中访问$this->getHistories(),这会触发学说加载整个集合而不是仅加载即使启用了延迟加载,也需要相关的历史记录)。在这种情况下不是一个干净的解决方案。这属于存储库方法,可以在从数据库中获取关系之前过滤掉不需要的关系。
  • @nifr - 这不再是真的。您现在可以使用criteria 进行过滤。如果集合尚未加载,这样做将在 SQL 级别执行过滤。
【解决方案2】:

您可以在控制器中调用的方法中找到 state_to 为 4 的历史记录对象。然后将其传递给视图。此方法可以在您的控制器中,但最好将它放在您的历史存储库中?或经理..

尽量避免视图的复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多