2011-12-18 41 views
40

我想写一个查询(与子查询),但我不知道如何在我的子查询设置限制。 我的查询:设定LIMIT与教义2?

$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查询中没有“LIMIT”。我们能做简单的LIMIT与教条2吗?

+0

的MySQL还不支持 '限制和IN/ALL/ANY/SOME子查询' – 2016-11-07 16:14:10

回答

3

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

例如

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

不以我的情况下工作。当我使用$ query_ids-> getDql()LIMIT缺失。 – bux 2012-04-11 14:46:43

+4

为什么这有upvotes?它与OP完全相同,但它只是将更多的作业添加到同一个变量中 – 2014-11-07 11:05:21

41
$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(); 
+1

您的回复正在工作,这是我在生产代码中使用的,因为我问了这个问题。但在我的问题,我搜索设置我的第一个查询LIMIT,用于他的DQL在第二个查询。 (并且只做一个数据库查询)。 – bux 2012-04-11 14:48:47

+0

这是有效的代码还是伪代码?当我尝试Symfony错误'注意:数组到字符串转换'时,我可以尝试一个自定义Hydrator来返回一维数组并且爆裂,因为似乎没有一个已经构建的那样做:http:// docs.doctrine-project.org/en/2.1/reference/dql-doctrine-query-language.html#hydration-modes – HMR 2014-06-19 02:46:09

+0

如果您在DQL中使用JOIN,请小心。它不会达到预期效果:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#first-and-max-result-items -dql-query-only – 2015-09-16 21:15:35

0
$limit=5; // for exemple 

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

->setMaxResults($limit); 

$results = $query->getResult(); 

// Done 
+2

请不要只发布工作代码,而且还要简要说明和总结您的工作。 – 2014-06-01 16:57:41

+1

SORRY这是我第一次在这里做一个帖子,所以为了设置一个限制,我们必须在查询 setMaxResults($ limit) 中执行此功能,并且不要忘记定义$ limit – 2014-06-01 17:11:22

+0

@Badrèddine - 您可以编辑您的答案以改进它。 SO允许我们纠正错误,请充分利用。 – APC 2014-06-01 17:14:07

14

我用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); 
+0

问题是如何限制子查询实体,例如相关实体。 – 2016-11-07 16:15:47

1
$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]; 
+1

欢迎StackOverflow的,请阅读本指南,了解如何编写一个很好的答案:https://stackoverflow.com/help/how-to-answer您应该添加一些上下文的代码,并解释如何/为什么这个工程。 – Graham 2017-08-11 11:47:39