TL明確的實體; DR:我如何使用Doctrine\ORM\EntityManager::clear()
使用$entityName
?的EntityManager:只有某些類型的
比方說,我有一個Post
實體與Author
和Category
。我想添加帖子到我的數據庫(隨機,從CSV文件或任何)。我在添加數據時遇到性能問題。內存使用增加,並減慢了進程,但我不知道如何(部分)清除EntityManager。
這就是魔法發生循環:
$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
。這是正確的,因爲Author
是由已被清除EntityManager管理的。
這是明確的方法:
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);
或$entityName = Acme\BlogBundle\Entity\Post::class
會有所幫助,但不幸的是它不清除任何東西。
如何正確使用這個參數?
我猜你必須通過某事類同'「AcmeBlogBundle:郵報」' –
可能的重複http://stackoverflow.com/questions/19061870/doctrine-entitymanager-clear-doesnt-fully-clear? –
@johnSmith不,沒有任何區別。 –