OneToMany枝条过滤器

时间:2018-06-18 19:19:49

标签: symfony twig twig-filter

我有一篇文章和更多评论。我只想显示未标记为'已删除的评论'。 我尝试过类似的东西,但我知道这不正确。

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

我试图删除5条未标记为“已删除”的评论。我该怎么办?

2 个答案:

答案 0 :(得分:1)

你可以尝试

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

但我担心它可能会导致少于5条评论,因为如果评论未被删除,它会在测试之前先切片。

相反,你最好在articleRepository中编写一个自定义方法,它只提供未删除的注释。

# 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 %}

答案 1 :(得分:0)

非常感谢您的支持,但是我找到了另一个解决方案,并且我认为它看起来更好。

Article实体中,我创建了一个新方法:

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

此函数仅返回未删除的注释。 (来源:https://knpuniversity.com/screencast/collections/easy-collection-filtering

注意:嫩枝与所讨论的相同。