--- /dev/null
+<?php
+
+namespace Wallabag\CoreBundle\Subscriber;
+
+use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
+use Doctrine\Common\EventSubscriber;
+use Doctrine\ORM\Mapping\ClassMetadataInfo;
+
+/**
+ * Puts a prefix to each table.
+ *
+ * Solution from :
+ * - http://stackoverflow.com/a/23860613/569101
+ * - http://doctrine-orm.readthedocs.org/en/latest/reference/namingstrategy.html
+ */
+class TablePrefixSubscriber implements EventSubscriber
+{
+ protected $prefix = '';
+
+ public function __construct($prefix)
+ {
+ $this->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;
+ }
+ }
+ }
+}