Symfony2 Doctrine加入实体

时间:2013-02-10 13:19:18

标签: symfony annotations doctrine

我有一个下一次加入的实体:

class blogComment
{
    ....

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

    ....
}

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

怎么做?

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

Nested comments

2 个答案:

答案 0 :(得分: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)在getter中使用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)使用Filters。这些可以向查询添加where子句,而不管生成查询的位置。请参阅docs

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

答案 1 :(得分: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();

编辑:

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