在Doctrine2

时间:2015-09-04 10:21:28

标签: php symfony doctrine-orm

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

$datas = array();//initialise array
        foreach ($island as $is) {
            $datas[] = array($is->getName(),$is->getNums() );
        }

其中$ 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;

选民与城市有关,城市与省有关,省与地区有关,地区与岛屿有关。我想显示每个岛屿的名字并计算并显示每个岛屿的所有选民&#39 ; s名称

我的表格结构如下所示

  id name city_id //voters table
  id name province_id //city
  id name region_id // province
  id name island_id // region
  id name //island  

我只需使用此功能即可显示所有岛名

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

导致

  array(4) {
    [0]=>
    array(1) {
     ["name"]=>
    string(5) "Luzon"
  }
    [1]=>
     array(1) {
       ["name"]=>
       string(8) "Mindanao"
 }

但我也想在每个岛上统计并获得所有选民。任何想法?

更新

我决定为此创建一个服务,因为这个项目正在使用Doctrine查询' ..我测试了这个以在我的twig中创建一个自定义过滤器。这个方法将计算每个岛名的所有选民,正是我想要的。

 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;
 }
}

在services.yml

 duterte.twig.app_extension:
    class: Project\Bundle\DuterteBundle\Twig\AppExtension
    tags:
        - { name: twig.extension }
    arguments:
        em: "@doctrine.orm.entity_manager"  

现在在模板中

  {% 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()));
        }

但我不能使用方法

  

尝试调用名为&#34; number_votes&#34;的未定义方法。类&#34; Project \ Bundle \ DuterteBundle \ Twig \ AppExtension&#34;。

1 个答案:

答案 0 :(得分:0)

终于明白了......花了好几个小时试图让这段代码起作用后,我终于得到了解决方案。

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

   $island = $em->getRepository('DuterteBundle:Island')->createQueryBuilder('i')
       ->orderBy('i.name', 'ASC')
       ->getQuery()
       ->getResult();

我的Twig扩展服务看起来与此类似

   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;
}

现在在控制器内

   $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
        }