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!';