Explicitly set Id with Doctrine when using “AUTO” strategy

前端 未结 7 712
时光说笑
时光说笑 2020-12-02 05:36

My entity uses this annotation for it\'s ID:

/**
 * @orm:Id
 * @orm:Column(type=\"integer\")
 * @orm:GeneratedValue(s         


        
7条回答
  •  猫巷女王i
    2020-12-02 05:59

    New solution works fine only when ALL entities have id before insert. When one entity has ID and another one does not - new solution is failing.

    I use this function for import all my data:

    function createEntity(\Doctrine\ORM\EntityManager $em, $entity, $id = null)
    {
        $className = get_class($entity);
        if ($id) {
            $idRef = new \ReflectionProperty($className, "id");
            $idRef->setAccessible(true);
            $idRef->setValue($entity, $id);
    
            $metadata = $em->getClassMetadata($className);
            /** @var \Doctrine\ORM\Mapping\ClassMetadataInfo $metadata */
            $generator = $metadata->idGenerator;
            $generatorType = $metadata->generatorType;
    
            $metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());
            $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
    
            $unitOfWork = $em->getUnitOfWork();
            $persistersRef = new \ReflectionProperty($unitOfWork, "persisters");
            $persistersRef->setAccessible(true);
            $persisters = $persistersRef->getValue($unitOfWork);
            unset($persisters[$className]);
            $persistersRef->setValue($unitOfWork, $persisters);
    
            $em->persist($entity);
            $em->flush();
    
            $idRef->setAccessible(false);
            $metadata->setIdGenerator($generator);
            $metadata->setIdGeneratorType($generatorType);
    
            $persisters = $persistersRef->getValue($unitOfWork);
            unset($persisters[$className]);
            $persistersRef->setValue($unitOfWork, $persisters);
            $persistersRef->setAccessible(false);
        } else {
            $em->persist($entity);
            $em->flush();
        }
    }
    

提交回复
热议问题