Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 高效地迭代大型OneToMany–;多通协会_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 高效地迭代大型OneToMany–;多通协会

Symfony 高效地迭代大型OneToMany–;多通协会,symfony,doctrine-orm,Symfony,Doctrine Orm,我有两个实体User和Period,它们有多个关联:一个用户属于多个Period,一个Period有多个用户。此关联使用UserPeriod实体 class Period { /** * @ORM\OneToMany(targetEntity="UserPeriod", mappedBy="period") */ private $users; } class UserPeriod { /** * @ORM\Id * @ORM\M

我有两个实体
User
Period
,它们有多个关联:一个用户属于多个Period,一个Period有多个用户。此关联使用
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;
}
我试图实现的是从定义的时间段获取所有用户的列表。因为有很多用户,所以我不能将它们全部加载到内存中,必须对它们进行迭代(批处理)。以下是我尝试过的:

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();
但是,提出了以下例外情况:

[Doctrine\ORM\Query\QueryException]                                                                           
Iterate with fetch join in class UserPeriod using association user not allowed.
我无法使用本机查询,因为
User
使用表继承。

当使用多对多或一对多加入时会发生这种情况 然后,您不能对查询进行迭代,因为它可能是 同一实体可能位于多行中

如果您向查询中添加了一个distinct,那么所有查询都将正常工作 确保每个记录都是唯一的


您可以使用setMaxResults()限制行数,并使用分页原则检索所有用户。我假设您不会在同一个视图上显示上百个用户的详细信息。@s响应这不是为了显示,我需要对所有用户都进行一些处理。事实上,您不能使用获取和加入集合值关联的查询进行迭代@sdespont我确实理解您的观点,实际上我已经知道:因为一个连接可能导致每个根实体有多行,所以迭代可能不起作用。但是,在我的例子中,所有连接都是“1:1”,因此行数与实体数匹配。
$qb = $this->createQueryBuilder('o');
$qb->distinct()->join('o.manyRelationship');
$i = $qb->iterator;
echo 'Profit!';