OneToMany фильтр веток

У меня есть одна статья и еще несколько комментариев. Я хочу отображать только те комментарии, которые не помечены как «Удаленные». Я пробовал что-то подобное, но знаю, что это неправильно.

{% for comment in article.comments([{delete: false}])|slice(0, 5) %}
    // ...
{% endfor %}

Я пытаюсь снять 5 комментариев, которые не помечены как «удаленные». Как мне это сделать?

какой результат с этим кодом ??

Juan I. Morales Pestana 18.06.2018 21:42

Попробуйте записать логику фильтрации в новом методе в Article, а затем нарезать эти результаты.

malarzm 18.06.2018 22:13

@ JuanI.MoralesPestana ни одной ошибки не было, ничего не изменилось. (Я тоже удалил кеш).

GasKa 19.06.2018 18:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
3
193
2

Ответы 2

Вы могли бы попробовать

{% for comment in article.comments|slice(0, 5) if not comment.deleted %}
    // ...
{% endfor %}

Но я боюсь, что это может привести к менее чем 5 комментариям, потому что перед тестированием он будет сначала нарезать, если комментарий не будет удален.

Вместо этого вы могли бы лучше написать собственный метод в вашем репозитории статей, который доставляет только комментарии, которые не удаляются.

# src/AppBundle/Repository/ArticleRepository.php

namespace AppBundle\Repository;

class ArticleRepository extends \Doctrine\ORM\EntityRepository
{
    public function getAllWithoutDeletedComments()
    {
        return $this->getEntityManager()->createQuery(
            'SELECT a FROM AppBundle:Article a
            JOIN a.comments c WITH c.deleted=0'
        )   ->getResult();
    }
}

И вызовите его со своего контроллера:

$em = $this->getDoctrine()->getManager();

$articles = $em->getRepository('AppBundle:Article')->getAllWithoutDeletedComments();

Или, в качестве альтернативы, добавьте метод к своей сущности, который фильтрует комментарии, которые не удаляются

public function getActiveComments($limit = 5)
{
    $counter = 0;
    $activeComments = [];

    foreach($this->comments as $comment) 
    {
        if (!$comment->getDeleted())
        {
            $activeComments[] = $comment;

            if (++$counter == $limit)
            {
                break;
            }
        }
    }

    return $activeComments;
}

и, конечно, назовите это в Twig:

{% for comment in article.activeComments() %}
    // ...
{% endfor %}

Я очень ценю вашу поддержку, но я нашел другое решение, и, на мой взгляд, оно выглядит лучше.

В сущности Article я создал новый метод:

public function getAvailableComments()
{
    return $this->getComments()->filter(function(Comment $comment) {
        return !$comment->isDeleted();
    });
}

Эта функция возвращает только не удаленные комментарии. (Источник: https://knpuniversity.com/screencast/collections/easy-collection-filtering)

Примечание: Twig такой же, как в вопросе.

Согласен с тобой @DarkBee, но для чего мне этого достаточно :)

GasKa 20.06.2018 17:16

Другие вопросы по теме