/** * @param ClassMetadata $class * @param array $entityData * @param string $revType * @param boolean $draft */ private function saveRevisionEntityData($class, $entityData, $revType) { $version = $this->getRevisionId(); $params = array($version ? $version : 1, $revType); $types = array(Type::INTEGER, Type::STRING); $fields = array(); foreach ($class->associationMappings as $field => $assoc) { if ($class->isInheritanceTypeJoined() && $class->isInheritedAssociation($field)) { continue; } if (!(($assoc['type'] & ClassMetadata::TO_ONE) > 0 && $assoc['isOwningSide'])) { continue; } if (!$this->annotationReader->isPropertyRevised($class->name, $field)) { continue; } $data = isset($entityData[$field]) ? $entityData[$field] : null; $relatedId = false; if ($data !== null && $this->uow->isInIdentityMap($data)) { $relatedId = $this->uow->getEntityIdentifier($data); } $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); foreach ($assoc['sourceToTargetKeyColumns'] as $sourceColumn => $targetColumn) { $fields[$sourceColumn] = true; if ($data === null) { $params[] = null; $types[] = \PDO::PARAM_STR; } else { $params[] = $relatedId ? $relatedId[$targetClass->fieldNames[$targetColumn]] : null; $types[] = $targetClass->getTypeOfColumn($targetColumn); } } } foreach ($class->fieldNames as $field) { if (array_key_exists($field, $fields)) { continue; } if ($class->isInheritanceTypeJoined() && $class->isInheritedField($field) && !$class->isIdentifier($field)) { continue; } if (!$this->annotationReader->isPropertyRevised($class->name, $field) && !$class->isIdentifier($field)) { continue; } $params[] = isset($entityData[$field]) ? $entityData[$field] : null; $types[] = $class->fieldMappings[$field]['type']; } if ($class->isInheritanceTypeJoined() && $class->name == $class->rootEntityName) { $params[] = $entityData[$class->discriminatorColumn['name']]; $types[] = $class->discriminatorColumn['type']; } if ($class->isInheritanceTypeJoined() && $class->name != $class->rootEntityName) { $entityData[$class->discriminatorColumn['name']] = $class->discriminatorValue; $this->saveRevisionEntityData($this->em->getClassMetadata($class->rootEntityName), $entityData, $revType); } $this->conn->executeUpdate($this->getRevisionSQL($class), $params, $types); }
/** * @param ClassMetadataInfo $cm * @param string $columnName * @return bool */ protected function isColumnRevised(ClassMetadataInfo $cm, $columnName) { try { $propertyName = $cm->getFieldForColumn($columnName); return $this->annotationReader->isPropertyRevised($cm->name, $propertyName); } catch (MappingException $e) { if ($cm->isInheritanceTypeSingleTable()) { foreach ($cm->subClasses as $subClass) { $subClassMeta = $this->getClassMetaData($subClass); try { $propertyName = $subClassMeta->getFieldForColumn($columnName); return $this->annotationReader->isPropertyRevised($subClassMeta->name, $propertyName); } catch (MappingException $e) { } } } } return false; }