我想在多个相关联接中显示名称并计算其相关值。 我想像这样循环结果
$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;。
答案 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
}