我有两个实体User
和Period
,它们有一个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;
}
我想要实现的是从定义的时间段获取所有用户的列表。由于有很多用户,我无法将它们全部加载到内存中并且必须对它们进行迭代(批处理)。这是我试过的:
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
使用表继承。
答案 0 :(得分:1)
使用MANY_TO_MANY或ONE_TO_MANY加入时会发生这种情况 您的查询然后您不能迭代它,因为它是潜在的 可能是同一个实体可能在多行中。
如果您在查询中添加了一个不同的内容,那么所有内容都将按原样运行 保证每条记录都是独一无二的。
$qb = $this->createQueryBuilder('o');
$qb->distinct()->join('o.manyRelationship');
$i = $qb->iterator;
echo 'Profit!';