TL; DR:如何使用Doctrine\ORM\EntityManager::clear()
使用$entityName
?
我们说我已经拥有Post
和Author
的{{1}}实体。我想在我的数据库中添加帖子(随机,从CSV文件或任何其他)。我在添加数据时遇到了性能问题。内存使用量增加并且会减慢进程,但我不知道如何(部分)清除EntityManager。
这是神奇发生的循环:
Category
这会抛出$batchSize = 250;
foreach ($posts as $post) {
//$post['author'] is instance of Acme\BlogBundle\Author
$post = new Post($post['author'], $post['category']);
$em->persist($post);
if ($i % $batchSize == 0) {
$entity = '??';
$em->flush();
$em->clear($entityName);
gc_collect_cycles();
}
}
。这是正确的,因为Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship Acme\BlogBundle\Post#author
由已被清除的EntityManager管理。
这是一个明确的方法:
Author
由于我想要清除帖子,但想要保留作者和类别实体类型,我希望namespace Doctrine\ORM;
class EntityManager implements EntityManagerInterface {
/**
* Clears the EntityManager. All entities that are currently managed
* by this EntityManager become detached.
*
* @param string|null $entityName if given, only entities of this type will get detached
*
* @return void
*/
public function clear($entityName = null)
{
$this->unitOfWork->clear($entityName);
}
}
,$entityName = 'Acme\BlogBundle\Entity\Post'
或$entityName = get_class($post);
会有所帮助,但遗憾的是它没有&# 39;清除任何事情。
如何正确使用此参数?
答案 0 :(得分:0)
您可以将classname作为entityName传递给entitymanager clear方法,但它必须与doctrine工作单元存储在其身份映射中完全相同。为了得到合适的人,你应该做那样的事情:
$classMetadata = $em->getClassMetadata(get_class($post));
$entityName = $classMetadata->rootEntityName;