0

我有一个具有下一个连接的实体:

class blogComment
{
    ....

    /**
     * @ORM\OneToMany(targetEntity="BlogComment", mappedBy="replyTo")
     */
    protected $replies;

    ....
}

现在我成功地得到了所有的回复。但我只想得到:where active = true

怎么做?

好吧,如果你们建议在控制器中通过查询获取评论,如何构建嵌套数组以获得如下结果:

嵌套评论

4

2 回答 2

3

为了解决您只需要主动回复的部分,有几个选项:

1)在存储库中使用一些自定义 DQL:

$dql = 'SELECT bc FROM BlogComment bc WHERE bc.replyTo = :id AND bc.active = :active';
$q = $em->createQuery($dql)
    ->setParameters(array('id' => $id, 'active' => true));

2)ArrayCollection::filter()在吸气剂中使用:

public function getReplies()
{
    return $this->replies
        ->filter(function ($reply) {
            return $reply->isActive();
        })
        ->toArray();
}

3)在getter中使用ArrayCollection::matching()Collection Criteria API ):

use Doctrine\Common\Collections\Criteria;

// ...

public function getReplies()
{
    $criteria = new Criteria::create()
        ->where(Criteria::expr()->eq('active', true));

    return $this->replies
        ->matching($criteria)
        ->toArray();
}

4)使用过滤器。这些可以将 where 子句添加到查询中,而不管该查询是在哪里生成的。请参阅文档

如果您希望能够在单个查询中获取整套回复、嵌套和所有回复,则需要实现某种“嵌套集”功能的“树”。我建议您查看l3pp4rd/DoctrineExtensions的Tree行为。

于 2013-09-18T19:43:12.170 回答
0

http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html

无论您在何处获取博客评论以显示它们(可能在控制器上),您都需要自定义查询以便只提取活动回复。就像是:

$query = $em->createQuery('SELECT b FROM blogComment b JOIN b.replies r WHERE r.active = :active');
$query->setParameter('active', true);
$blogComments = $query->getResult();

编辑:

对于嵌套回复的新要求,您需要指定评论实体与其父评论之间的关系。

于 2013-02-10T13:25:49.943 回答