Как получить доступ к функциям сущностей с параметрами в TWIG — symfony2

У меня есть шаблон ветки в моем проекте 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 %}

Но я почти уверен, что есть более приятный способ.


person Milos Cuculovic    schedule 29.10.2013    source источник
comment
Что ж, вместо того, чтобы извлекать все ваши сущности из базы данных и пытаться фильтровать их в своем шаблоне... вы должны создать метод репозитория, чтобы извлекать ТОЛЬКО те, которые имеют history.statusTo = 4, и передавать их в шаблон. Подобная логика не должна быть включена в шаблон.   -  person Nicolai Fröhlich    schedule 29.10.2013
comment
Хорошая идея @nifr, +1 тебе.   -  person Miloš    schedule 29.10.2013


Ответы (2)


Добавьте метод getHistoryByStatus($status) в свою сущность для фильтрации ваших историй на основе поля status_to, а затем в своем шаблоне:

{% set filtered_history = submission.historyByStatus(4)|default(false) %}
{% if filtered_history %}
    {{ filtered_history.statusDate|date("d F Y") }}
{% endif %}
person bjuice    schedule 29.10.2013
comment
Метод в entity по-прежнему будет извлекать все связанные истории (поскольку вам нужно будет получить доступ к $this->getHistories() внутри этого метода, который запускает доктрину для загрузки всей коллекции, а не только связанных историй, необходимых даже при включенной ленивой загрузке) . Не чистое решение в этом случае. Это относится к методу репозитория, чтобы отфильтровать ненужные отношения перед получением отношений из базы данных. - person Nicolai Fröhlich; 29.10.2013
comment
@nifr - это уже не так. Теперь вы можете использовать критерии для фильтрации. Это приведет к выполнению фильтрации на уровне SQL, если коллекция еще не загружена. - person timdev; 18.12.2015

вы можете просто найти объект истории, где state_to равно 4, в методе, вызываемом в вашем контроллере. затем передайте его в представление. Этот метод может быть внутри вашего контроллера, но, может быть, лучше иметь его в вашем хранилище истории? или менеджер..

старайтесь избегать сложности представлений.

person fidelio    schedule 29.10.2013