用学说 2 设置 LIMIT?

Posted

技术标签:

【中文标题】用学说 2 设置 LIMIT?【英文标题】:Set LIMIT with doctrine 2? 【发布时间】:2012-01-23 03:46:55 【问题描述】:

我试图编写一个查询(带有子查询),但我不知道如何在我的子查询中设置限制。 我的查询:

$query_ids = $this->getEntityManager()
      ->createQuery(
        "SELECT e_.id
        FROM MuzichCoreBundle:Element e_
        WHERE [...]
        GROUP BY e_.id")
     ->setMaxResults(5)
    ;

$query_select = "SELECT e
      FROM MuzichCoreBundle:Element e 
      WHERE e.id IN (".$query_ids->getDql().")
      ORDER BY e.created DESC, e.name DESC"
    ;

$query = $this->getEntityManager()
      ->createQuery($query_select)
      ->setParameters($params)
    ;

但是 ->setMaxResults(5) 不起作用。 SQL 查询中没有“限制”。我们可以用学说 2 做简单的 LIMIT 吗?

【问题讨论】:

mysql 还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询' 证明 'doctrine does not support limit in subqyery' 的链接是:github.com/doctrine/orm/issues/3979 所以使用本机直接 sql 查询! 【参考方案1】:

您的 setMaxResults($limit) 需要在对象上设置。

例如

$query_ids = $this->getEntityManager()
  ->createQuery(
    "SELECT e_.id
    FROM MuzichCoreBundle:Element e_
    WHERE [...]
    GROUP BY e_.id")
;
$query_ids->setMaxResults($limit);

【讨论】:

在我的情况下不起作用。当我使用 $query_ids->getDql() 时,缺少 LIMIT。 为什么会有赞成票?它与 OP 完全相同,但它只是为同一个变量添加了更多的赋值【参考方案2】:
$query_ids = $this->getEntityManager()
      ->createQuery(
        "SELECT e_.id
        FROM MuzichCoreBundle:Element e_
        WHERE [...]
        GROUP BY e_.id")
     ->setMaxResults(5)
     ->setMaxResults($limit) 
    ;

在第二个查询中,应该传递第一个查询的结果..

$query_select = "SELECT e
      FROM MuzichCoreBundle:Element e 
      WHERE e.id IN (".$query_ids->getResult().")
      ORDER BY e.created DESC, e.name DESC"
    ;


$query = $this->getEntityManager()
      ->createQuery($query_select)
      ->setParameters($params)
      ->setMaxResults($limit);
    ;

$resultCollection = $query->getResult();

【讨论】:

您的回复有效,这是我在生产代码中使用的,因为我提出了这个问题。但在我的问题中,我搜索在我的第一个查询中设置一个 LIMIT,以便在第二个查询中使用他的 DQL。 (并且只进行一次数据库查询)。 那是有效代码还是伪代码?当我尝试使用 Notice: Array to string conversion 解决 Symfony 错误时,我可以尝试自定义 Hydrator 以返回一维数组并内爆它,因为似乎还没有一个已经构建的这样做:docs.doctrine-project.org/en/2.1/reference/… 在 DQL 中使用 JOIN 时要小心。它不会按预期执行:docs.doctrine-project.org/projects/doctrine-orm/en/latest/…【参考方案3】:
$limit=5; // for exemple

$query = $this->getDoctrine()->getEntityManager()->createQuery(
           '// your request')

->setMaxResults($limit);

 $results = $query->getResult();

// Done

【讨论】:

请不要只发布工作代码,还要对您的工作进行简短的解释和总结。 SORRY 这是我第一次在这里发帖,所以为了设置限制,我们必须在查询 setMaxResults($limit) 中执行此功能,并且不要忘记定义 $limit @Badrèddine - 您可以编辑您的答案以改进它。 SO 让我们能够纠正我们的错误,所以请好好利用。【参考方案4】:

我为此使用 Doctrine\ORM\Tools\Pagination\Paginator,它运行良好(原则 2.2)。

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

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

【讨论】:

问题是如何限制子查询实体,例如相关实体。【参考方案5】:
 $qb = $this->getDoctrine()->getManager()->createQueryBuilder();  
 $qb->select('p') ->from('Pandora\UserBundle\Entity\PhoneNumber', 'p');
$qb->where('p.number = :number');
$qb->OrWhere('p.validatedNumber=:number');
$qb->setMaxResults(1);
$qb->setParameter('number',$postParams['From'] );
$result = $qb->getQuery()->getResult();
 $data=$result[0];

【讨论】:

欢迎来到 ***,请阅读本指南以了解如何编写一个好的答案:***.com/help/how-to-answer 您应该在代码中添加一些上下文并解释其工作原理/原因。

以上是关于用学说 2 设置 LIMIT?的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2.1 性能问题

在学说 2 中是不是可以有一个不是主键的自动增量列?

zf2 + 学说 2 上的用户定义函数不起作用

具有不止一种方法的嘲弄学说/存储库

了解学说级联操作

symfony 3 学说不接受主键