Пример #1
0
 /**
  * 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;
 }