猿问

原则 2,与条件的关联映射

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

带有条件的 Doctrine2 关联映射

但是,我需要带有批准评论的文章集合:

如何在没有 N+1 的情况下进行关联映射?

$articles = $repository->findAllArticlesWithApprovedComments();


    Foreach($articles as $article){

       $article->getTitle();

       foreach($article->getAprovedComments() as $comment){

           $comment->getText();

       }

    }

如果我使用延迟加载,标准有效,但它的 N+1 问题。如果我使用 Eager load(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]


心有法竹
浏览 181回答 1
1回答

呼啦一阵风

您可以使用 ajoin而不是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();由于这是一个左连接,它将返回所有文章,即使它们没有任何已批准的评论。
随时随地看视频慕课网APP
我要回答