在大型OneToMany – ManyToOne关联上有效地进行迭代

les*_*enk 5 symfony doctrine-orm

我有两个实体UserPeriod,它们具有ManyToMany关联:一个用户属于多个期间,一个期间具有多个用户。该关联使用UserPeriod实体。

class Period
{
    /**
     * @ORM\OneToMany(targetEntity="UserPeriod", mappedBy="period")
     */
    private $users;
}

class UserPeriod
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="User", inversedBy="periods")
     */
    private $user;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Period", inversedBy="users")
     */
    private $period;
}

class User extends BaseUser
{
    /**
     * @ORM\OneToMany(targetEntity="UserPeriod", mappedBy="user")
     */
    protected $periods;
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是获取定义期间内所有用户的列表。由于用户很多,因此无法将它们全部加载到内存中,而必须在它们上进行迭代(批处理)。这是我尝试过的:

public function getUsersOfQuery($period)
{
    return $this->_em->createQueryBuilder()
                ->select('u')
                ->from('SGLotteryUserBundle:LotteryUser', 'u')
                ->innerJoin('u.periods', 'p')
                ->where('p.period = :id')
                ->setParameter('id', $period->id())
                ->getQuery();
}

$it = $repo->getUsersOfQuery($period)->iterate();
Run Code Online (Sandbox Code Playgroud)

但是,引发了此异常:

[Doctrine\ORM\Query\QueryException]                                                                           
Iterate with fetch join in class UserPeriod using association user not allowed.
Run Code Online (Sandbox Code Playgroud)

由于User使用表继承,因此无法使用本机查询。

Fre*_*man 6

Github 问题

在查询中使用 MANY_TO_MANY 或 ONE_TO_MANY 连接时会发生这种情况,然后您无法对其进行迭代,因为同一个实体可能位于多行中。

如果您在查询中添加一个不同的,那么所有的都将起作用,因为它将保证每条记录都是唯一的。

$qb = $this->createQueryBuilder('o');
$qb->distinct()->join('o.manyRelationship');
$i = $qb->iterator;
echo 'Profit!';
Run Code Online (Sandbox Code Playgroud)