From bd0f3d32c9ccb8f7a1409edb960b909a5e6a096d Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sat, 24 Oct 2015 15:28:02 +0200 Subject: Quoted entity to avoid reserved keyword Should fix #1498 --- .../Subscriber/TablePrefixSubscriber.php | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php (limited to 'src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php') diff --git a/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php new file mode 100644 index 00000000..8ec85e64 --- /dev/null +++ b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php @@ -0,0 +1,47 @@ +prefix = (string) $prefix; + } + + public function getSubscribedEvents() + { + return array('loadClassMetadata'); + } + + public function loadClassMetadata(LoadClassMetadataEventArgs $args) + { + $classMetadata = $args->getClassMetadata(); + // if we are in an inheritance hierarchy, only apply this once + if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) { + return; + } + + $classMetadata->setTableName($this->prefix . $classMetadata->getTableName()); + + foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { + if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) { + $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name']; + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; + } + } + } +} -- cgit v1.2.3 From 735068d1814a4b7a688e1d19cd17b13e8c5da3eb Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 25 Oct 2015 15:55:19 +0100 Subject: Add tests on TablePrefixSubscriber --- src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php') diff --git a/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php index 8ec85e64..0019eead 100644 --- a/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php +++ b/src/Wallabag/CoreBundle/Subscriber/TablePrefixSubscriber.php @@ -8,6 +8,9 @@ use Doctrine\ORM\Mapping\ClassMetadataInfo; /** * Puts a prefix to each table. + * This way were used instead of using the built-in strategy from Doctrine, using `naming_strategy` + * Because it conflicts with the DefaultQuoteStrategy (that espace table name, like user for Postgres) + * see #1498 for more detail. * * Solution from : * - http://stackoverflow.com/a/23860613/569101 @@ -30,17 +33,18 @@ class TablePrefixSubscriber implements EventSubscriber public function loadClassMetadata(LoadClassMetadataEventArgs $args) { $classMetadata = $args->getClassMetadata(); + // if we are in an inheritance hierarchy, only apply this once if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) { return; } - $classMetadata->setTableName($this->prefix . $classMetadata->getTableName()); + $classMetadata->setTableName($this->prefix.$classMetadata->getTableName()); foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) { $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name']; - $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix.$mappedTableName; } } } -- cgit v1.2.3