用学说 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 supportlimit
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?的主要内容,如果未能解决你的问题,请参考以下文章