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();
}