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
}