Php 在Doctrine2中的5个表的多个联接中计数和显示相关记录

Php 在Doctrine2中的5个表的多个联接中计数和显示相关记录,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我想在多个相关联接中显示名称并计算其相关值。 我想这样循环结果 $datas = array();//initialise array foreach ($island as $is) { $datas[] = array($is->getName(),$is->getNums() ); } id name city_id //voters table id name province_id //city id n

我想在多个相关联接中显示名称并计算其相关值。 我想这样循环结果

$datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$is->getNums() );
        }
  id name city_id //voters table
  id name province_id //city
  id name region_id // province
  id name island_id // region
  id name //island  
   public function a($id)
{
    $em = $this->getDoctrine()->getManager();
    $qb=$em->createQueryBuilder('i');
    $qb->select('count(v.id)')
      ->from('DuterteBundle:Voters','v')
      ->join('v.city','c')
      ->join('c.province','p')
      ->join('p.region','r')
      ->join('r.island','i')
      ->where('i.id = :x')
      ->setParameter('x',$id);
    $count = $qb->getQuery()->getSingleScalarResult(); 
    return $count;
}
其中$is->getNums()是检索到的每个岛屿名称的投票者总数

到目前为止我试过这个

  $island=$this->em->createQueryBuilder();
  $island->select('count(v.id) as getNums')
  ->from('DuterteBundle:Voters','v')
  ->join('v.city','c')
  ->join('c.province','p')
  ->join('p.region','r')
  ->join('r.island','i')
   $count = $island->getQuery()->getSingleScalarResult(); 
return $count;
选民与城市相关,城市与省份相关,省份与地区相关,地区与岛屿相关。我想显示每个岛屿的名称,并以每个岛屿的名称计算和显示所有选民

我的桌子结构是这样的

$datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$is->getNums() );
        }
  id name city_id //voters table
  id name province_id //city
  id name region_id // province
  id name island_id // region
  id name //island  
   public function a($id)
{
    $em = $this->getDoctrine()->getManager();
    $qb=$em->createQueryBuilder('i');
    $qb->select('count(v.id)')
      ->from('DuterteBundle:Voters','v')
      ->join('v.city','c')
      ->join('c.province','p')
      ->join('p.region','r')
      ->join('r.island','i')
      ->where('i.id = :x')
      ->setParameter('x',$id);
    $count = $qb->getQuery()->getSingleScalarResult(); 
    return $count;
}
只需使用此函数,我就可以显示所有岛屿名称

$island = $em->getRepository('Bundle:Island')->findAll();
导致

  array(4) {
    [0]=>
    array(1) {
     ["name"]=>
    string(5) "Luzon"
  }
    [1]=>
     array(1) {
       ["name"]=>
       string(8) "Mindanao"
 }
但我也想数一数每个岛上的所有选民,有什么想法吗

更新

我决定为此创建一个服务,因为这个项目正在使用条令查询“大量”…我测试了这个方法,在我的小枝中创建一个自定义过滤器。这个方法将计算每个岛屿名称的所有投票人,这正是我上面想要的

 my custome twig filter

 <?php

 namespace Project\Bundle\DuterteBundle\Twig;

 class AppExtension extends \Twig_Extension
 {
 protected $em;

 public function __construct($em)
 {
  $this->em = $em;
 }

 public function getFunctions()
{
  return array(
   //this is the name of the function you will use in twig
   new \Twig_SimpleFunction('number_votes', array($this, 'a'))
 );
}

 public function getName()
{

 return 'app.extension';
}   

public function a($id)
{
$qb=$this->em->createQueryBuilder();
$qb->select('count(v.id)')
  ->from('DuterteBundle:Voters','v')
  ->join('v.city','c')
  ->join('c.province','p')
  ->join('p.region','r')
  ->join('r.island','i')
  ->where('i.id = :x')
  ->setParameter('x',$id);
   $count = $qb->getQuery()->getSingleScalarResult(); 
  return $count;
 }
}
现在在模板中

  {% for island in island %}
    {{ number_votes(island.id) }}
  {% endfor %}

  outputs
  mindanao= 500,
  visayas =  670;
  so on....
完美..这是我在控制器中真正想要的。显示岛屿名称以及检索每个岛屿名称的计数。现在可以在控制器中使用这个吗

我在控制器上试过这个

 $no = $this->container->get('duterte.twig.app_extension');

 datas = array();//initialise array
        foreach ($island as $is) {
             //$no = $this->container->get('duterte.twig.app_extension');
            $datas[] = array($is->getName(),$no->number_votes($is->getId()));
        }
   $dat = $this->container->get('app_extension');
    $datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$dat->a($is->getId()));
        }
但是我不能用这种方法

试图调用类“Project\Bundle\DuterteBundle\Twig\AppExtension”中名为“number_vots”的未定义方法


终于明白了……在花了几个小时试图让代码正常工作之后,我终于找到了解决方案

首先,我在Doctrine2中的5个表中没有找到计算多重联接值的解决方案。因此,创建一个服务是我最后的选择。我创建了一个细枝扩展并在控制器内部调用它

   $island = $em->getRepository('DuterteBundle:Island')->createQueryBuilder('i')
       ->orderBy('i.name', 'ASC')
       ->getQuery()
       ->getResult();
我的树枝扩展服务看起来就像这样

$datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$is->getNums() );
        }
  id name city_id //voters table
  id name province_id //city
  id name region_id // province
  id name island_id // region
  id name //island  
   public function a($id)
{
    $em = $this->getDoctrine()->getManager();
    $qb=$em->createQueryBuilder('i');
    $qb->select('count(v.id)')
      ->from('DuterteBundle:Voters','v')
      ->join('v.city','c')
      ->join('c.province','p')
      ->join('p.region','r')
      ->join('r.island','i')
      ->where('i.id = :x')
      ->setParameter('x',$id);
    $count = $qb->getQuery()->getSingleScalarResult(); 
    return $count;
}
现在在控制器内部

 $no = $this->container->get('duterte.twig.app_extension');

 datas = array();//initialise array
        foreach ($island as $is) {
             //$no = $this->container->get('duterte.twig.app_extension');
            $datas[] = array($is->getName(),$no->number_votes($is->getId()));
        }
   $dat = $this->container->get('app_extension');
    $datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$dat->a($is->getId()));
        }
哎呀,没有错误,但不显示任何结果

因此,将其转换为整数将最终实现,所以

$dat = $this->container->get('app_extension');
    $datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),(int)$dat->a($is->getId()));//here
        }

终于明白了……在花了几个小时试图让代码正常工作之后,我终于找到了解决方案

首先,我在Doctrine2中的5个表中没有找到计算多重联接值的解决方案。因此,创建一个服务是我最后的选择。我创建了一个细枝扩展并在控制器内部调用它

   $island = $em->getRepository('DuterteBundle:Island')->createQueryBuilder('i')
       ->orderBy('i.name', 'ASC')
       ->getQuery()
       ->getResult();
我的树枝扩展服务看起来就像这样

$datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$is->getNums() );
        }
  id name city_id //voters table
  id name province_id //city
  id name region_id // province
  id name island_id // region
  id name //island  
   public function a($id)
{
    $em = $this->getDoctrine()->getManager();
    $qb=$em->createQueryBuilder('i');
    $qb->select('count(v.id)')
      ->from('DuterteBundle:Voters','v')
      ->join('v.city','c')
      ->join('c.province','p')
      ->join('p.region','r')
      ->join('r.island','i')
      ->where('i.id = :x')
      ->setParameter('x',$id);
    $count = $qb->getQuery()->getSingleScalarResult(); 
    return $count;
}
现在在控制器内部

 $no = $this->container->get('duterte.twig.app_extension');

 datas = array();//initialise array
        foreach ($island as $is) {
             //$no = $this->container->get('duterte.twig.app_extension');
            $datas[] = array($is->getName(),$no->number_votes($is->getId()));
        }
   $dat = $this->container->get('app_extension');
    $datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$dat->a($is->getId()));
        }
哎呀,没有错误,但不显示任何结果

因此,将其转换为整数将最终实现,所以

$dat = $this->container->get('app_extension');
    $datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),(int)$dat->a($is->getId()));//here
        }