php - Doctrine 批量插入 - 实体管理器清除

标签 php mysql symfony doctrine-orm

我想通过批处理向数据库中插入 10 000 行。 在第一步中,我需要从数据库中选择一些对象,然后对这些对象进行交互,并为每个对象将另一个对象保存到数据库中。 这是代码示例:

 $em = $this->getDoctrine()->getManager();
    $products = $em->getRepository('MyBundle:Product')->findAll(); // return 10 000 products
    $category = $em->getRepository('MyBundle:Category')->find(1);
    $batchsize = 100;
    foreach ($products as $i => $product) {
        $entity = new TestEntity();
        $entity->setCategory($category);
        $entity->setProduct($product); // MyEntity And Product is OneToOne Mapping with foreign key in MyEntity
        $em->persist($entity);
        if ($i % $batchsize === 0) {
            $em->flush();
            $em->clear();
        }
    }
    $em->flush();
    $em->clear();

它返回这个错误:

A new entity was found through the relationship 'Handel\GeneratorBundle\Entity\GenAdgroup#product' that was not configured to cascade persist operations for entity

我认为问题出在 clear() 中,它删除了内存中的所有对象,包括 $products 和 $category

如果我在关联中使用 cascade={"persist"},doctrine 在数据库中插入新的类别行。

经过一些尝试,我犯了一些肮脏的实体错误。

我做错了什么吗?这项工作的解决方案和最佳实践是什么? 非常感谢解答

最佳答案

解决方案只是清除那些正在更改/创建的对象。那些不变的应该留在 EntityManager 中。

像这样

$em->clear(TestEntity::class);
$em->clear(...);

如果您在没有参数的情况下保持清晰,它将分离实体管理器下的所有当前对象。这意味着如果您尝试重用它们,它会在您获得时抛出错误。例如,唯一的文件将被复制并抛出该错误。

关于php - Doctrine 批量插入 - 实体管理器清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587496/

相关文章:

symfony - 如何在 Symfony 中注入(inject)验证器

PHP 和 MySQL 安全 : one-way encryption Vs two-way encryption

php - PHP 和 MySQL 的 Multi-Tenancy

php - Symfony 2 - 如何将数据传递给 formBuilder?

php - 使用 $smarty 显示来自 mysql 数据库的数据时出错

mysql - Mysql上不同密码的Schema之间传输特定表数据

php - 从 Composer 创建 Symfony2 项目时出错

php - MySQL int 列允许 null 但将 null 输入为零

PHP 删除功能不起作用

php - 在此示例中如何从数据库中删除一行?