我有一个下一次加入的实体:
class blogComment
{
....
/**
* @ORM\OneToMany(targetEntity="BlogComment", mappedBy="replyTo")
*/
protected $replies;
....
}
现在我成功回复了所有回复。但我只想得到:where active = true
怎么做?
如果你们建议在控制器中通过查询获取注释,如何构建嵌套数组以获得如下结果:
答案 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。
如果您希望能够在单个查询中获取整套回复,嵌套和全部,则需要实现“嵌套集”功能的某种“树”。我建议您查看Tree的l3pp4rd/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();
编辑:
对于嵌套回复的新要求,您需要指定注释实体与其父注释之间的关系。