Doctrine orm 信条查询生成器,单向一对多关系上的左连接

Doctrine orm 信条查询生成器,单向一对多关系上的左连接,doctrine-orm,count,Doctrine Orm,Count,我使用原则2.5,我很难用queryBuilder执行多次计数请求 MDD 如您所见,AbstractArticle实体与Tag nammedmainTag有多个关系,与相同entityTag nammedtags有多个关系 我想做什么 我想从标记ID列表中请求计算AbstractArticle主标记和AbstractArticle默认标记的数量 这就是我想要的回报 +--------+-------------------------+----------------------------

我使用原则2.5,我很难用queryBuilder执行多次计数请求

MDD
如您所见,AbstractArticle实体与Tag nammed
mainTag
有多个关系,与相同entityTag nammed
tags
有多个关系

我想做什么 我想从标记ID列表中请求计算AbstractArticle主标记和AbstractArticle默认标记的数量

这就是我想要的回报

+--------+-------------------------+----------------------------+
| TagId  | mainTaggedArticleCount  | defaultTaggedArticleCount  |
+--------+-------------------------+----------------------------+
|      1 |                       2 |                          0 |
|      2 |                       0 |                          5 |
|      3 |                       2 |                          2 |
+--------+-------------------------+----------------------------+
我目前的尝试 我通过以下mySQL请求成功地实现了这一点,我得到了我想要的:

SELECT 
tag.id as tagId,
(select count(DISTINCT aaMain.id)) as mainTaggedArticleCount,
(select count(DISTINCT aaDefault.id)) as defaultTaggedArticleCount

FROM tag tag
/* Left join on ManyToOne nammed `mainTag` */
LEFT JOIN abstract_article aaMain ON aaMain.main_tag_id = tag.id
/* Left join on ManyToMany nammed `tags` with the junction table */
LEFT JOIN abstract_article_tag aat ON aat.tag_id = tag.id
LEFT JOIN abstract_article aaDefault ON aaDefault.id = aat.abstract_article_id

where tag.id in (3, 1, 5, 6) /* My list of tag Ids */
group by tag.id
但是教义要复杂得多>我做到了! 对于2个子请求,这里是我的解决方案

在我的标记库中

$repoAbastractArticle = $this->getEntityManager()->getRepository("AbstractArticle");

// SubRequest for main tagged article
$countMainTaggedArticleSubQuery = $repoAbstractArticle->createQueryBuilder("abstract_article");
$countMainTaggedArticleSubQuery->select('COUNT(DISTINCT abstract_article.id)')
    ->leftJoin('abstract_article.mainTag', 'mainTag')
    ->andWhere($countMainTaggedArticleSubQuery->expr()->eq('mainTag.id', 'tag.id'));

// SubRequest for tagged article 
$countDefaultTaggedAbstractArticleSubQuery = $repoAbstractArticle->createQueryBuilder("default_tagged_abstract_article");
$countDefaultTaggedAbstractArticleSubQuery->select('COUNT(DISTINCT default_tagged_abstract_article.id)')
    ->leftJoin('default_tagged_abstract_article.tags', 'tags')
    ->andWhere($countDefaultTaggedAbstractArticleSubQuery->expr()->eq('tags.id', 'tag.id'));

// Main request
$qb = $this->createQueryBuilder("tag");
    $qb->select('
    tag.id AS tagId, 
    (' . $countMainTaggedArticleSubQuery . ') AS mainTaggedArticleCount, 
    (' . $countDefaultTaggedAbstractArticleSubQuery . ') AS defaultTaggedArticleCount'
    )
    ->groupBy('tag.id')
    ->andWhere($qb->expr()->in('tag.id', ':tagIds'))
    ->setParameter('tagIds', $tagIds);

return $qb->getQuery()->getResult();
$repoAbastractArticle = $this->getEntityManager()->getRepository("AbstractArticle");

// SubRequest for main tagged article
$countMainTaggedArticleSubQuery = $repoAbstractArticle->createQueryBuilder("abstract_article");
$countMainTaggedArticleSubQuery->select('COUNT(DISTINCT abstract_article.id)')
    ->leftJoin('abstract_article.mainTag', 'mainTag')
    ->andWhere($countMainTaggedArticleSubQuery->expr()->eq('mainTag.id', 'tag.id'));

// SubRequest for tagged article 
$countDefaultTaggedAbstractArticleSubQuery = $repoAbstractArticle->createQueryBuilder("default_tagged_abstract_article");
$countDefaultTaggedAbstractArticleSubQuery->select('COUNT(DISTINCT default_tagged_abstract_article.id)')
    ->leftJoin('default_tagged_abstract_article.tags', 'tags')
    ->andWhere($countDefaultTaggedAbstractArticleSubQuery->expr()->eq('tags.id', 'tag.id'));

// Main request
$qb = $this->createQueryBuilder("tag");
    $qb->select('
    tag.id AS tagId, 
    (' . $countMainTaggedArticleSubQuery . ') AS mainTaggedArticleCount, 
    (' . $countDefaultTaggedAbstractArticleSubQuery . ') AS defaultTaggedArticleCount'
    )
    ->groupBy('tag.id')
    ->andWhere($qb->expr()->in('tag.id', ':tagIds'))
    ->setParameter('tagIds', $tagIds);

return $qb->getQuery()->getResult();