我有类似的问题和数据库结构:
Doctrine2 association mapping with conditions
但是,我需要具有经批准的评论的文章集:
如何进行无N + 1的关联映射?
$articles = $repository->findAllArticlesWithApprovedComments();
Foreach($articles as $article){
$article->getTitle();
foreach($article->getAprovedComments() as $comment){
$comment->getText();
}
}
条件有效,如果我使用延迟加载,但是它的N + 1问题。如果我使用急切的负载(join和addSelect)-条件不起作用。
如果我使用此代码:
$articles = $em->createQueryBuilder()
->from(Article::class,'article')
->leftJoin('article.comments','comments')
->addSelect('article')
->addSelect('comments')
->andWhere('comments.approved= :ap ')
->setParameter('ap',true)
->getQuery()->getResult();
我将收到带有批注的文章,但如果该文章有0条评论,则不会归入文章集。
如何获得带有批注的文章,但如果文章中没有评论,则该文章仍保留在收藏夹中?
示例:我在数据库中:
Article1: [approvedComment, nonAprovedComment]
Article2: [nonAprovedComment]
Article3: [approvedComment]
我需要结果(带有原则,代码中未过滤):
Article1: [approvedComment]
Article2: []
Article3: [approvedComment]
您可以使用join
而不是where
条件来在数据库级别过滤您的集合。
您的查询将如下所示:
$articles = $em->createQueryBuilder()
->from(Article::class, 'article')
->leftJoin('article.comments', 'comments', 'WITH', 'comments.approved = :ap')
->addSelect('article')
->addSelect('comments')
->setParameter('ap', true)
->getQuery()->getResult();
由于这是左联接,即使没有任何批准的评论,它也会返回所有文章。