我有一个特定的对象,我将其传递给twig进行循环。
protected $dateFormat = 'm/d/Y h:i a';
我通过"类别"从控制器到循环的对象。
我可以看到整个关系树都在那里使用dump(),我需要在twig中获取每个类别的注释量。
是否可能有像
这样的东西categories -> post -> comments
是否可以在Categories实体中使用getter?
提前多多感谢。
答案 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 - 这意味着该关联将是ArrayCollection
或PersistentCollection
。无论哪种方式,都实现了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的PrePersist
和PreUpdate
生命周期钩子来计算记录持久保存到数据库。
这样的事情:
<?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)