【问题标题】:How to limits results by main entity, not with childrens?如何通过主要实体而不是子实体限制结果?
【发布时间】:2018-07-02 06:41:07
【问题描述】:

如何通过主要实体而不是子实体来限制结果?

如果我这样做:

    $queryBuilder = $em->createQueryBuilder();

    $queryBuilder->select('n, c');
    $queryBuilder->from('AppBundle:News', 'n');
    $queryBuilder->leftJoin('n.comments', 'c');
    $queryBuilder->setMaxResults(3);

    $results = $queryBuilder->getQuery()->getResult();

例如,第一个新闻有 3 个 cmets,然后结果只返回一个记录新闻。如果我没有 cmets 或者如果我删除了 leftJoin,那么它运行良好。

【问题讨论】:

  • 在查询生成器中,您不能或删除 cmets 上的左连接并延迟加载您的 cmets 数据,但这会产生 N+1 查询问题
  • 误解了关于我的第一个重复标志的问题,但重复的 stackoverflow.com/questions/5620771/… 仍然提供了解决方案。

标签: php symfony doctrine symfony3.x


【解决方案1】:

您为结果使用了错误的变量。

您正在使用$queryBuilder 准备您的声明:

$queryBuilder = $em->createQueryBuilder();

但是用$qb 来得到你的结果;

$results = $qb->getQuery()->getResult();

【讨论】:

  • 对不起,这是我在 stackoverflow 上的错误。
【解决方案2】:

Doctrine 在连接、多个 where 和分页时可能会出现意外行为。

推荐的方式是使用Paginator,而不是直接调用getResults。 分页器将结果分组处理到主实体。

编辑:提供一些示例代码:

<?php
use Doctrine\ORM\Tools\Pagination\Paginator;

$dql = "SELECT p, c FROM BlogPost p JOIN p.comments c";
$query = $entityManager->createQuery($dql)
                       ->setFirstResult(0)
                       ->setMaxResults(100);

$paginator = new Paginator($query, $fetchJoinCollection = true);

$c = count($paginator);
foreach ($paginator as $post) {
    echo $post->getHeadline() . "\n";
}

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/pagination.html

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 2019-01-11
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多