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