Doctrine 2, сопоставление ассоциации с условиями - PullRequest
0 голосов
/ 24 января 2020

У меня похожая проблема и структура БД:

Отображение ассоциации 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]

Мне нужен результат (с doctrine, без фильтра в коде):

Article1: [approvedComment]
Article2: []
Article3: [approvedComment]

1 Ответ

2 голосов
/ 25 января 2020

Вы можете использовать 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();

Поскольку это левое соединение, он вернет все статьи, даже если у них нет утвержденных комментариев.

...