第2章,条件的关联映射

问题描述 投票:0回答:1

我有类似的问题和数据库结构:

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]
php symfony doctrine
1个回答
0
投票

您可以使用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();

由于这是左联接,即使没有任何批准的评论,它也会返回所有文章。

© www.soinside.com 2019 - 2024. All rights reserved.