Doctrine ORM - 计算查询中的非映射属性

时间:2018-04-04 19:25:38

标签: doctrine-orm

我有两个相关实体 - ThreadReply,用户可以发布对帖子的回复。

当我使用ORM QueryBuilder返回线程实体列表时,我还希望包含一个布尔标志,指示当前用户是否已发布对该线程的回复。最初我考虑过向Thread实体添加一个属性,并以某种方式在查询中设置它,但它并不觉得Thread应该知道发布回复的用户。解决这个问题的最佳方法是什么,理想情况下,每个线程返回时需要执行二次查询?

1 个答案:

答案 0 :(得分:0)

您可以使用左连接

$qb = $em->getRepository(Thread::class)->createQueryBuilder('a');
$qb->addSelect('count(r)');
$qb->leftJoin('a.replies', 'r' , 'WITH', 'r.user = :userId');
$qb->groupBy('a');
$qb->setParameter('userId', 8);
$result = $qb->getQuery()->getResult();

使用count(r),您将获得用户每个帖子发布的回复数量。您必须遍历结果以检查计数是否>> 0

foreach($result as $row) {
    $thread = $row[0];
    $hasReplied = ($row[1] > 0 ? true: false);
}