我有以下情况:
我需要基于一对实体
创建大量实体(实体C)所以我决定做以下事情:
$AEntities = $em->getRepository('MyBundle:EntityA')->findAll();
$DEntity = $em->getRepository('MyBundle:EntityD')->findOneBy($params);
$iterableResult = $em->getRepository('MyBundle:EntityB')
->createQueryBuilder('b')
->getQuery()->iterate();
$batchSize = 50
while (($row = $iterableResult->next()) !== false) {
foreach($AEntities as $AEntity) {
$entity = new Entity\EntityC();
$entity->setEntityD($DEntity);
$entity->setEntityB($row[0]);
$entity->setEntityA($AEntity);
$em->persist($entity);
}
if(($i % $batchSize) == 0){
$em->flush();
$em->clear();
}
$em->detach($row[0]);
$i++;
}
$em->flush();
的指示
但当我执行$em->detach($row[0]);
并刷新错误时通过该关系找到了一个新实体......
我已经尝试过没有$em->detach($row[0]);
但这种高内存消耗
我需要:是在使用后释放每个实体B的内存,但同时每次刷新或按组而不是一个一个,并清除所有实体C
答案 0 :(得分:1)
调用clear() on entity manager分离所有对象(默认情况下)。顺便说一下,你可以传递实体名称来分离给定类型的实体:
$em->clear('EntityB');
$em->clear('EntityC');
我认为你试图分离已经分离的实体,因此它被视为新的。
尝试删除clear()
电话。您也可以尝试删除detach()
来电并在所选实体上致电clear()
。
答案 1 :(得分:1)
您必须完全指定实体名称
$em->clear('Acme\MyBundle\Entity\EntityB');
$em->clear('Acme\MyBundle\Entity\EntityC');