我有两个条令实体类:VertriebsschieneFiliale

/**
 * 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/

10-09 07:25