我有两个条令实体类:Vertriebsschiene
和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;
...
}
/**
* Filiale
*
* @ORM\Table(name="filiale")
* @ORM\Entity(repositoryClass="CRMBundle\Repository\FilialeRepository")
*/
class Filiale extends Lieferant
{
/**
* @var Vertriebsschiene
*
* @ORM\ManyToOne(targetEntity="CRMBundle\Entity\Vertriebsschiene", inversedBy="filialen", fetch="EAGER")
*/
private $vertriebsschiene;
...
}
Vertriebsschine
对象有一个非uniqe名称。现在我试图显示一个Vertriebsschiene
对象列表,其中包含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);
}
}
我的问题是,
Vertriebsschiene::$filiale
数组集合不是自动加载的,而是为每个导致许多DB连接的Vertriebsschiene
加载的。这也有一个问题,即在获取
WHERE
时忽略Vertriebsschiene::$filiale
语句。COUNT(f)
返回正确数量的Filiale
对象。我怀疑这是
GROUP BY
语句的问题。 最佳答案
我认为问题是你没有告诉doctrine选择filiale
字段。
尝试在您的选择中添加filiale
别名:
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();
}
如果你在profiler中检查你的查询,我想你会看到条令添加了一个
LEFT JOIN fialiale f0_ ON v0_.id = f0_.vertriebsschiene_id
(或者类似的东西,但是没有添加SELECT ... f0_.id, f0_.xxxx
。因此,每次调用
$vertriebsschiene->getFieliale()->getXXX()
条令时,都必须执行相应的查询以获取分公司数据。关于mysql - 教义不会使用GROUP BY自动加载联接关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44507442/