From bf6655a534a6775d30cafa67bd801276bda1d98d Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 13 Aug 2024 23:45:21 +0200 Subject: =?UTF-8?q?VERSION=200.2=20doctrine=20ORM=20et=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doctrine/orm/src/Utility/PersisterHelper.php | 108 +++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 vendor/doctrine/orm/src/Utility/PersisterHelper.php (limited to 'vendor/doctrine/orm/src/Utility/PersisterHelper.php') diff --git a/vendor/doctrine/orm/src/Utility/PersisterHelper.php b/vendor/doctrine/orm/src/Utility/PersisterHelper.php new file mode 100644 index 0000000..76e9242 --- /dev/null +++ b/vendor/doctrine/orm/src/Utility/PersisterHelper.php @@ -0,0 +1,108 @@ + + * + * @throws QueryException + */ + public static function getTypeOfField(string $fieldName, ClassMetadata $class, EntityManagerInterface $em): array + { + if (isset($class->fieldMappings[$fieldName])) { + return [$class->fieldMappings[$fieldName]->type]; + } + + if (! isset($class->associationMappings[$fieldName])) { + return []; + } + + $assoc = $class->associationMappings[$fieldName]; + + if (! $assoc->isOwningSide()) { + return self::getTypeOfField($assoc->mappedBy, $em->getClassMetadata($assoc->targetEntity), $em); + } + + if ($assoc->isManyToManyOwningSide()) { + $joinData = $assoc->joinTable; + } else { + $joinData = $assoc; + } + + $types = []; + $targetClass = $em->getClassMetadata($assoc->targetEntity); + + foreach ($joinData->joinColumns as $joinColumn) { + $types[] = self::getTypeOfColumn($joinColumn->referencedColumnName, $targetClass, $em); + } + + return $types; + } + + /** @throws RuntimeException */ + public static function getTypeOfColumn(string $columnName, ClassMetadata $class, EntityManagerInterface $em): string + { + if (isset($class->fieldNames[$columnName])) { + $fieldName = $class->fieldNames[$columnName]; + + if (isset($class->fieldMappings[$fieldName])) { + return $class->fieldMappings[$fieldName]->type; + } + } + + // iterate over to-one association mappings + foreach ($class->associationMappings as $assoc) { + if (! $assoc->isToOneOwningSide()) { + continue; + } + + foreach ($assoc->joinColumns as $joinColumn) { + if ($joinColumn->name === $columnName) { + $targetColumnName = $joinColumn->referencedColumnName; + $targetClass = $em->getClassMetadata($assoc->targetEntity); + + return self::getTypeOfColumn($targetColumnName, $targetClass, $em); + } + } + } + + // iterate over to-many association mappings + foreach ($class->associationMappings as $assoc) { + if (! $assoc->isManyToManyOwningSide()) { + continue; + } + + foreach ($assoc->joinTable->joinColumns as $joinColumn) { + if ($joinColumn->name === $columnName) { + $targetColumnName = $joinColumn->referencedColumnName; + $targetClass = $em->getClassMetadata($assoc->targetEntity); + + return self::getTypeOfColumn($targetColumnName, $targetClass, $em); + } + } + } + + throw new RuntimeException(sprintf( + 'Could not resolve type of column "%s" of class "%s"', + $columnName, + $class->getName(), + )); + } +} -- cgit v1.2.3