如何访问Twig中实体对象的关系元素数(Symfony 4)

时间:2018-01-25 01:32:55

标签: php symfony twig

我有一个特定的对象,我将其传递给twig进行循环。

protected $dateFormat = 'm/d/Y h:i a';

我通过"类别"从控制器到循环的对象。

我可以看到整个关系树都在那里使用dump(),我需要在twig中获取每个类别的注释量。

是否可能有像

这样的东西
categories -> post -> comments

是否可以在Categories实体中使用getter?

提前多多感谢。

2 个答案:

答案 0 :(得分:4)

正如您在问题中所建议的那样,您确实可以在您的顶级getTotalComments()对象中添加Category方法。

我在这里对你的代码做了一些假设,但是一个示例实现可能会迭代/映射/减少子Post个对象的集合,并计算它们的子Comment个对象的总和; e.g:

<?php

class Categories
{
    public function getTotalCommentCount()
    {        
        return array_reduce($this->posts->toArray(), function ($total, Post $post) {
            return $total + $post->comments->count();
        }, 0);
    }
}

或者您可能更喜欢循环:

public function getTotalCommentCount()
{        
    $commentCount = 0;

    foreach ($this->posts as $post) {
        $commentCount += $post->count();
    }

    return $commentCount;
}

我假设您正在使用Doctrine - 这意味着该关联将是ArrayCollectionPersistentCollection。无论哪种方式,都实现了PHP的Countable接口,这允许它们与PHP内置函数count()(及其别名sizeof()一起使用。这也意味着有在此对象上定义的count()方法。

这可能在计算上很昂贵,因此您可能决定执行以下几项操作之一,包括在计算后存储该值:

<?php

class Categories
{
    private $commentCount = null;

    public function getTotalCommentCount()
    {        
        if (!$this->commentCount) {
            $this->commentCount = 0;
            foreach ($this->posts as $post) {
                $this->commentCount += $post->count();
            }
        }

        return $this->commentCount;
    }
}

或者您可以使用Doctrine创建持久性$commentCount属性,并使用Doctrine的PrePersistPreUpdate生命周期钩子来计算记录持久保存到数据库。

这样的事情:

<?php

/**
 * @ORM\HasLifecycleEvents()
 */
class Categories
{
    /**
     * @ORM\Column(name="comment_count", type="integer")
     */
    private $commentCount;

    public function getTotalCommentCount()
    {        
        return $this->commentCount;
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function calculateCommentCount()
    {
        // this method runs every time 
        // this object is persisted/flushed 
        // to the database

        $this->commentCount = 0;
        foreach ($this->posts as $post) {
            $this->commentCount += $post->count();
        }
    }
}

有关此处的更多信息:

https://symfony.com/doc/current/doctrine/lifecycle_callbacks.html

希望这会有所帮助:)

答案 1 :(得分:1)

如果您在类别和评论类之间创建关系, 使用类似这样的东西

sizeof($category1->post->comments)