+<?php
+
+namespace Wallabag\CoreBundle\Doctrine\Mapping;
+
+use Doctrine\ORM\Mapping\NamingStrategy;
+
+/**
+ * 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 PrefixedNamingStrategy implements NamingStrategy
+{
+ protected $prefix = '';
+
+ public function __construct($prefix)
+ {
+ $this->prefix = (string) $prefix;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function classToTableName($className)
+ {
+ return strtolower($this->prefix . substr($className, strrpos($className, '\\') + 1));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function propertyToColumnName($propertyName, $className = null)
+ {
+ return $propertyName;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function referenceColumnName()
+ {
+ return 'id';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function joinColumnName($propertyName)
+ {
+ return $propertyName . '_' . $this->referenceColumnName();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function joinTableName($sourceEntity, $targetEntity, $propertyName = null)
+ {
+ // for join table we don't want to have both table concatenated AND prefixed
+ // we just want the whole table to prefixed once
+ // ie: not "wallabag_entry_wallabag_tag" but "wallabag_entry_tag"
+ $target = substr($targetEntity, strrpos($targetEntity, '\\') + 1);
+
+ return strtolower($this->classToTableName($sourceEntity) . '_' .$target);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function joinKeyColumnName($entityName, $referencedColumnName = null)
+ {
+ return strtolower($this->classToTableName($entityName) . '_' .($referencedColumnName ?: $this->referenceColumnName()));
+ }
+}