3 namespace Wallabag\CoreBundle\Event\Subscriber
;
5 use Doctrine\Common\EventSubscriber
;
6 use Doctrine\ORM\Event\LoadClassMetadataEventArgs
;
7 use Doctrine\ORM\Mapping\ClassMetadataInfo
;
10 * Puts a prefix to each table.
11 * This way were used instead of using the built-in strategy from Doctrine, using `naming_strategy`
12 * Because it conflicts with the DefaultQuoteStrategy (that espace table name, like user for Postgres)
13 * see #1498 for more detail.
16 * - http://stackoverflow.com/a/23860613/569101
17 * - http://doctrine-orm.readthedocs.org/en/latest/reference/namingstrategy.html
19 class TablePrefixSubscriber
implements EventSubscriber
21 protected $prefix = '';
23 public function __construct($prefix)
25 $this->prefix
= (string) $prefix;
28 public function getSubscribedEvents()
30 return ['loadClassMetadata'];
33 public function loadClassMetadata(LoadClassMetadataEventArgs
$args)
35 $classMetadata = $args->getClassMetadata();
37 // if we are in an inheritance hierarchy, only apply this once
38 if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) {
42 $classMetadata->setPrimaryTable(['name' => $this->prefix
. $classMetadata->getTableName()]);
44 foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
45 if (ClassMetadataInfo
::MANY_TO_MANY
=== $mapping['type'] && isset($classMetadata->associationMappings
[$fieldName]['joinTable']['name'])) {
46 $mappedTableName = $classMetadata->associationMappings
[$fieldName]['joinTable']['name'];
47 $classMetadata->associationMappings
[$fieldName]['joinTable']['name'] = $this->prefix
. $mappedTableName;