猿问

学说2,与条件的关联映射

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


原则2 与条件的关联映射


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


如何做没有N + 1的协商映射?


$articles = $repository->findAllArticlesWithApprovedComments();


    Foreach($articles as $article){

       $article->getTitle();

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

           $comment->getText();

       }

    }

标准有效,如果我使用延迟加载,但它的N + 1问题。如果我使用预先加载(加入并添加选择) - 条件不起作用。


如果我使用此代码:


$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条评论,它将不会落入文章集合。


如何获取具有已批准评论的文章,但如果文章中没有评论,则文章仍保留在集合中?


示例:我在 DB 中有:


Article1: [approvedComment, nonAprovedComment]

Article2: [nonAprovedComment]

Article3: [approvedComment]

我需要结果(带有原则,代码中的非过滤器):


Article1: [approvedComment]

Article2: []

Article3: [approvedComment]


跃然一笑
浏览 97回答 1
1回答

万千封印

可以使用条件而不是条件在数据库级别筛选集合。joinwhere然后,您的查询将如下所示:$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
我要回答