Symfony:内部连接的分页

时间:2014-06-11 14:14:19

标签: php symfony doctrine-orm pagination

我需要实施分页。看来,Doctrine并不支持某些联合会。

这是我的问题:

$query = $this->getEntityManager()
              ->createQueryBuilder();

$query->setFirstResult(($page - 1) * $maxperpage);
$query->setMaxResults($maxperpage);

$query->select('d')
      ->from('DemandeBundle:Declaration', 'd')
      ->orderBy('d.id', 'ASC')
      ->innerJoin('ContactBundle:Contact', 'c', 'WITH', 'd.contact = c')
      ->where('c.structure_id = :structure_id')
      ->setParameter('structure_id', $structureId)
      ->getQuery()
      ->getResult();

return new Paginator($query, true);

当我不使用innerJoin时,它工作正常,但我需要使用它,以便只显示有关我的用户的请求。

使用innerJoin我遇到了这样的错误:

"An exception has been thrown during the rendering of a template 
("Cannot count query which selects two FROM components, cannot make distinction") in   
DemandeBundle:Demande:listing_demande.html.twig at line 25"

如果不使用其他捆绑或其他任何东西,我怎样才能避免这个问题。

希望你能理解我的人。

2 个答案:

答案 0 :(得分:5)

您的DeclarationContact有何关联?

在[{1}} ManyToOneContact关系指向Declaration会更好。这样,它将起作用,因为您不会拥有两个FROM组件,而是单个组件。

然后,修改查询以执行:

->innerJoin('d.contant', 'c')

完整查询应如下所示:

$query->select('d')
  ->from('DemandeBundle:Declaration', 'd')
  ->orderBy('d.id', 'ASC')
  ->innerJoin('d.contact', 'c') // <-- THIS LINE IS CRITICAL
  ->where('c.structure_id = :structure_id')
  ->setParameter('structure_id', $structureId)
  ->getQuery()
  ->getResult();

答案 1 :(得分:0)

最后,我找到了解决方案:

而不是:

$query->select('d')
      ->from('DemandeBundle:Declaration', 'd')
      ->orderBy('d.id', 'ASC')
      ->innerJoin('ContactBundle:Contact', 'c', 'WITH', 'd.contact = c')
      ->where('c.structure_id = :structure_id')
      ->setParameter('structure_id', $structureId)
      ->getQuery()
      ->getResult();

我用过:

$query->select('d')
      ->add('from', 'SgaDemandeBundle:Declaration d INNER JOIN d.contact c')
      ->where('c.structure_id = :structure_id')
      ->setParameter('structure_id', $structureId)
      ->orderBy('d.id', 'ASC')
      ->getQuery();