我如何在 Symfony2 中使用 Doctrine 进行 manyTomany 查询
How can I do a manyTomany query with Doctrine in Symfony2
我想知道有多少人 "afiliados" 有一个 "Campana"
查询必须如何?
我的课程是:
<?php
namespace Axonsystem\Bundles\CampanaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="afiliado")
*/
class Afiliado
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255,nullable=true)
*/
private $name;
/**
* @ORM\ManyToMany(targetEntity="Campana", inversedBy="afiliados")
* @ORM\JoinTable(name="afiliado_campana")
*
*/
protected $campanas;
..........
/**
* @ORM\Entity
* @ORM\Table(name="campana")
*/
class Campana {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Afiliado", mappedBy="campanas",cascade={"persist"})
*
*/
protected $afiliados;
..............
我去掉了 setter 和 getter 以及一些属性,这样内容显示起来更容易。
使用查询生成器,我认为这样可以做到:
$qb->select("COUNT(f) as num_afiliados")
->from('CampanaBundle\Entity\Campana', 's')
->innerJoin('s.afiliados', 'f')
->where('s.id=:id')
->setParameter('id',$id);
$id 包含您要查找会员数量的 campana 的 id。
更新
如果您想检索附属机构的名称
$qb->select("f.name")
->from('CampanaBundle\Entity\Campana', 's')
->innerJoin('s.afiliados', 'f')
->where('s.id=:id')
->setParameter('id',$id);
如果您使用的是 Symfony,只需调整查询即可。假设您在控制器中:
$ret = $this->getDoctrine()->getEntityManager()->createQueryBuilder()
->select("f.name")
->from('CampanaBundle:Campana', 's')
->innerJoin('s.afiliados', 'f')
->where('s.id=:id')
->setParameter('id', $id)
->getQuery()
->getResult();
您需要使用 QueryBuilder 来执行此查询。我建议为 Entity Afiliado 创建一个 Repository,并在 scribers 中这样写:
<?php
namespace Axonsystem\Bundles\CampanaBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;
class AfiliadoRepository extends EntityRepository
{
public function countByCampana($campanaId) {
return $this->getEntityManager()->createQueryBuilder()
->select('COUNT(a.id)')
->from('CampanaBundle:Afiliado', 'a')
->innerJoin('CampanaBundle:Campana', 'c', 'WITH', 'c.id = a.campanas')
->where('c.id = :campanaId')
->setParameter('campanaId', $campanaId)
->getQuery()
->getSingleScalarResult();
}
}
我想知道有多少人 "afiliados" 有一个 "Campana"
查询必须如何?
我的课程是:
<?php
namespace Axonsystem\Bundles\CampanaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="afiliado")
*/
class Afiliado
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255,nullable=true)
*/
private $name;
/**
* @ORM\ManyToMany(targetEntity="Campana", inversedBy="afiliados")
* @ORM\JoinTable(name="afiliado_campana")
*
*/
protected $campanas;
..........
/**
* @ORM\Entity
* @ORM\Table(name="campana")
*/
class Campana {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Afiliado", mappedBy="campanas",cascade={"persist"})
*
*/
protected $afiliados;
..............
我去掉了 setter 和 getter 以及一些属性,这样内容显示起来更容易。
使用查询生成器,我认为这样可以做到:
$qb->select("COUNT(f) as num_afiliados")
->from('CampanaBundle\Entity\Campana', 's')
->innerJoin('s.afiliados', 'f')
->where('s.id=:id')
->setParameter('id',$id);
$id 包含您要查找会员数量的 campana 的 id。
更新
如果您想检索附属机构的名称
$qb->select("f.name")
->from('CampanaBundle\Entity\Campana', 's')
->innerJoin('s.afiliados', 'f')
->where('s.id=:id')
->setParameter('id',$id);
如果您使用的是 Symfony,只需调整查询即可。假设您在控制器中:
$ret = $this->getDoctrine()->getEntityManager()->createQueryBuilder()
->select("f.name")
->from('CampanaBundle:Campana', 's')
->innerJoin('s.afiliados', 'f')
->where('s.id=:id')
->setParameter('id', $id)
->getQuery()
->getResult();
您需要使用 QueryBuilder 来执行此查询。我建议为 Entity Afiliado 创建一个 Repository,并在 scribers 中这样写:
<?php
namespace Axonsystem\Bundles\CampanaBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;
class AfiliadoRepository extends EntityRepository
{
public function countByCampana($campanaId) {
return $this->getEntityManager()->createQueryBuilder()
->select('COUNT(a.id)')
->from('CampanaBundle:Afiliado', 'a')
->innerJoin('CampanaBundle:Campana', 'c', 'WITH', 'c.id = a.campanas')
->where('c.id = :campanaId')
->setParameter('campanaId', $campanaId)
->getQuery()
->getSingleScalarResult();
}
}