From f4f889aef14653ecccd3eff6c1351a0c01445677 Mon Sep 17 00:00:00 2001 From: Vladimir Klimes Date: Fri, 19 Jul 2024 14:30:27 +0200 Subject: [PATCH 1/3] allow ManyToMany associations with referenced column name different from 'id' --- src/AuditReader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AuditReader.php b/src/AuditReader.php index 482e1018..26825901 100644 --- a/src/AuditReader.php +++ b/src/AuditReader.php @@ -1022,7 +1022,7 @@ private function createEntity($className, array $columnMap, array $data, $revisi foreach (self::getRelationToSourceKeyColumns($assoc) as $sourceKeyJoinColumn => $sourceKeyColumn) { $whereId[] = "{$sourceKeyJoinColumn} = ?"; - $reflField = $classMetadata->reflFields['id']; + $reflField = $classMetadata->reflFields[$classMetadata->getFieldName($sourceKeyColumn) ?? 'id']; \assert(null !== $reflField); $values[] = $reflField->getValue($entity); From 87b71df6906414b1c15b81290fd3745d14d4b577 Mon Sep 17 00:00:00 2001 From: Vladimir Klimes Date: Fri, 23 Aug 2024 11:15:39 +0200 Subject: [PATCH 2/3] test ManyToManyMultipleRelationshipSameTargetEntity with ID field of both common and custom names --- ...ultipleRelationshipCustomIdNamedEntity.php | 20 ++++++++++ tests/RelationTest.php | 37 ++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/Fixtures/Relation/ManyToManyMultipleRelationshipCustomIdNamedEntity.php diff --git a/tests/Fixtures/Relation/ManyToManyMultipleRelationshipCustomIdNamedEntity.php b/tests/Fixtures/Relation/ManyToManyMultipleRelationshipCustomIdNamedEntity.php new file mode 100644 index 00000000..35f8b447 --- /dev/null +++ b/tests/Fixtures/Relation/ManyToManyMultipleRelationshipCustomIdNamedEntity.php @@ -0,0 +1,20 @@ +addPrimaryTarget($targetOne); $manyToMany->addSecondaryTarget($targetTwo); + $targetThree = new ManyToManyMultipleTargetEntity(); + $targetFour = new ManyToManyMultipleTargetEntity(); + + $manyToManyWithCustomNameOfIdColumn = new ManyToManyMultipleRelationshipCustomIdNamedEntity(); + $manyToManyWithCustomNameOfIdColumn->setTitle('manyToMany#2'); + $manyToManyWithCustomNameOfIdColumn->addPrimaryTarget($targetThree); + $manyToManyWithCustomNameOfIdColumn->addSecondaryTarget($targetFour); + $em->persist($targetOne); $em->persist($targetTwo); + $em->persist($targetThree); + $em->persist($targetFour); $em->persist($manyToMany); + $em->persist($manyToManyWithCustomNameOfIdColumn); - $em->flush(); // #1 + $em->flush(); // #1 + #2 + // manyToMany#1 $manyToManyId = $manyToMany->getId(); static::assertNotNull($manyToManyId); @@ -399,6 +414,26 @@ public function testManyToManyMultipleRelationshipSameTargetEntity(): void // ensure that there is an audited entry for the secondaryTargets property static::assertInstanceOf(Collection::class, $audited->getSecondaryTargets()); static::assertCount(1, $audited->getSecondaryTargets()); + + // manyToMany#2 + $manyToManyId = $manyToManyWithCustomNameOfIdColumn->getId(); + static::assertNotNull($manyToManyId); + + $audited = $auditReader->find( + ManyToManyMultipleRelationshipCustomIdNamedEntity::class, + $manyToManyId, + 1 + ); + + static::assertNotNull($audited); + + // ensure that there is an audited entry for the primaryTargets property + static::assertInstanceOf(Collection::class, $audited->getPrimaryTargets()); + static::assertCount(1, $audited->getPrimaryTargets()); + + // ensure that there is an audited entry for the secondaryTargets property + static::assertInstanceOf(Collection::class, $audited->getSecondaryTargets()); + static::assertCount(1, $audited->getSecondaryTargets()); } /** From c734838864d0c485c4cd352991e17bf395e9179b Mon Sep 17 00:00:00 2001 From: Vladimir Klimes Date: Fri, 23 Aug 2024 11:53:26 +0200 Subject: [PATCH 3/3] obtain reflection properties of ID columns by using provider method already available in ClassMetadata --- .gitignore | 1 + src/AuditReader.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c7e266e7..28ad232a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # # It's auto-generated by sonata-project/dev-kit package. +.idea/ /build/ /node_modules/ /vendor/ diff --git a/src/AuditReader.php b/src/AuditReader.php index 26825901..5e882f32 100644 --- a/src/AuditReader.php +++ b/src/AuditReader.php @@ -1022,7 +1022,7 @@ private function createEntity($className, array $columnMap, array $data, $revisi foreach (self::getRelationToSourceKeyColumns($assoc) as $sourceKeyJoinColumn => $sourceKeyColumn) { $whereId[] = "{$sourceKeyJoinColumn} = ?"; - $reflField = $classMetadata->reflFields[$classMetadata->getFieldName($sourceKeyColumn) ?? 'id']; + $reflField = $classMetadata->getSingleIdReflectionProperty(); \assert(null !== $reflField); $values[] = $reflField->getValue($entity); @@ -1110,7 +1110,7 @@ private function createEntity($className, array $columnMap, array $data, $revisi )) { foreach ($targetAssoc['relationToTargetKeyColumns'] as $targetKeyJoinColumn => $targetKeyColumn) { $whereId[] = "{$targetKeyJoinColumn} = ?"; - $reflField = $classMetadata->reflFields['id']; + $reflField = $classMetadata->getSingleIdReflectionProperty(); \assert(null !== $reflField); $values[] = $reflField->getValue($entity); }