/** * Creates a managed entity * * @param string $className * @param array $data */ public function getOrCreateEntity($className, array $data) { $cm = $this->em->getClassMetadata($className); $entity = $cm->newInstance(); $oid = spl_object_hash($entity); $id = $this->flattenIdentifier($data, $cm); $this->cs->identifiers[$oid] = $id; $this->cs->states[$oid] = self::STATE_MANAGED; $this->cs->originalEntityData[$oid] = $data; $this->cs->identityMap[$cm->rootName][$id] = $entity; foreach ($data as $field => $value) { if (isset($cm->fieldMappings[$field])) { $cm->reflFields[$field]->setValue($entity, $value); } } foreach ($cm->associationMappings as $field => $assoc) { $associationId = isset($data[$field]) ? $data[$field] : null; $associationMetadata = $this->em->getClassMetadata($assoc['target']); $associationIdentifiers = $associationMetadata->getIdentifier(); if (ClassMetadata::REFERENCE_ONE === $cm->getTypeOfAssociation($field)) { if ($associationId) { $newValue = $this->em->getProxyFactory()->getProxy($assoc['target'], [$associationIdentifiers[0] => $associationId]); $cm->reflFields[$field]->setValue($entity, $newValue); } } elseif (ClassMetadata::REFERENCE_MANY === $cm->getTypeOfAssociation($field)) { $collection = new ArrayCollection(); foreach ($associationId as $id) { $newValue = $this->em->getProxyFactory()->getProxy($assoc['target'], [$associationIdentifiers[0] => $id]); $collection->add($newValue); } $cm->reflFields[$field]->setValue($entity, $collection); } } return $entity; }