EntityManager:仅清除某种类型的实体

时间:2016-02-12 13:56:58

标签: php symfony doctrine-orm doctrine entitymanager

TL; DR:如何使用Doctrine\ORM\EntityManager::clear()使用$entityName

我们说我已经拥有PostAuthor的{​​{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;清除任何事情。

如何正确使用此参数?

1 个答案:

答案 0 :(得分:0)

您可以将classname作为entityName传递给entitymanager clear方法,但它必须与doctrine工作单元存储在其身份映射中完全相同。为了得到合适的人,你应该做那样的事情:

$classMetadata = $em->getClassMetadata(get_class($post));
$entityName = $classMetadata->rootEntityName;