Mysql 条令不会使用GROUP BY自动加载联接关系
我有两个条令实体类:Mysql 条令不会使用GROUP BY自动加载联接关系,mysql,symfony,doctrine-orm,Mysql,Symfony,Doctrine Orm,我有两个条令实体类:vertriebschiene和Filiale: /** * Vertriebsschiene * * @ORM\Table(name="vertriebsschiene", indexes={ * @ORM\Index(columns={"name"}, flags={"fulltext"}) * })) * @ORM\Entity(repositoryClass="CRMBundle\Repository\VertriebsschieneReposit
vertriebschiene
和Filiale
:
/**
* Vertriebsschiene
*
* @ORM\Table(name="vertriebsschiene", indexes={
* @ORM\Index(columns={"name"}, flags={"fulltext"})
* }))
* @ORM\Entity(repositoryClass="CRMBundle\Repository\VertriebsschieneRepository")
*/
class Vertriebsschiene
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=100)
*/
private $name;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Filiale", mappedBy="vertriebsschiene", fetch="EAGER")
*/
private $filialen;
...
}
vertriebschine
对象具有非uniqe名称。现在,我尝试显示vertriebschiene
对象及其Filiale
对象的列表
我的findAllQuery方法如下所示:
/**
* @param User $user
* @return \Doctrine\ORM\Query
*/
public function findAllQuery(User $user){
$qb = $this->createQueryBuilder('v')
->select('v as vertriebsschiene')
->addSelect('COUNT(f) as filial_num')
->leftJoin('v.filialen', 'f')
->groupBy('v.name');
$this->restrictAccess($user, $qb);
return $qb->getQuery();
}
/**
* @param User $user
* @param $qb
*/
protected function restrictAccess(User $user, QueryBuilder &$qb)
{
if ($user->hasRole(RoleVoter::AUSSENDIENST)) {
$qb ->leftJoin('f.vertreter', 'u')
->leftJoin('u.vertretungen', 'vx')
->andWhere($qb->expr()->orX(
'f.vertreter = :userid',
'f.vertreter IS NULL',
$qb->expr()->andX(
'vx.proxy = :userid',
$qb->expr()->between(':currentDate', 'vx.start', 'vx.end')
)
))
->setParameter('userid', $user->getId())
->setParameter('currentDate', new \DateTime(), \Doctrine\DBAL\Types\Type::DATETIME);
}
}
我的问题是,vertriebschiene::$filiale
数组集合不是自动加载的,而是为每个vertriebschiene
加载的,从而导致许多数据库连接
这也有一个问题,即在获取vertriebschiene::$filiale
时忽略WHERE
语句
COUNT(f)
返回正确数量的Filiale
对象
我怀疑这是
GROUP BY
语句的问题。我认为问题在于您没有告诉条令选择分公司
字段
尝试在您的选择中添加分公司
别名:
public function findAllQuery(User $user){
$qb = $this->createQueryBuilder('v')
->select('v as vertriebsschiene', 'f')
->addSelect('COUNT(f) as filial_num')
->leftJoin('v.filialen', 'f')
->groupBy('v.name');
$this->restrictAccess($user, $qb);
return $qb->getQuery();
}
如果您在分析器中检查您的查询,我想您会看到条令在v0\u0.id=f0\u0.vertriebsschiene\u id上添加了一个左连接fialiale f0\uu(或者类似的东西,但不添加选择…f0\u0.id,f0\u0.xxxx
)
因此,每次调用$vertriebsschiene->getFieliale()->getXXX()
原则都必须执行相应的查询以获取分公司数据。不,这不起作用。问题是,只要我添加groupBy子句,只会选择一个分公司。
public function findAllQuery(User $user){
$qb = $this->createQueryBuilder('v')
->select('v as vertriebsschiene', 'f')
->addSelect('COUNT(f) as filial_num')
->leftJoin('v.filialen', 'f')
->groupBy('v.name');
$this->restrictAccess($user, $qb);
return $qb->getQuery();
}