symfony2.0&doctrine table prefixテーブル接頭辞の設定
2431 ワード
1.bundleの下にあるResources/config/servicesを開く.yml
2.prefixパラメータの追加、例えばデフォルトのacme
プラス
AcmeBundle\Subscriber\TablePrefixSubscriber.php
2.prefixパラメータの追加、例えばデフォルトのacme
parameters:
acmebundle.db.table_prefix: acme_
3.サービスの追加services:
acmebundle.tblprefix_subscriber:
class: AcmeBundle\Subscriber\TablePrefixSubscriber
arguments: [%mybundle.db.table_prefix%]
tags:
- { name: doctrine.event_subscriber }
4.添えるプラス
AcmeBundle\Subscriber\TablePrefixSubscriber.php
<?php
namespace AcmeBundle\Subscriber;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
class TablePrefixSubscriber implements \Doctrine\Common\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();
// Do not re-apply the prefix in an inheritance hierarchy.
if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) {
return;
}
if (FALSE !== strpos($classMetadata->namespace, 'AcmeBundle')) {
$classMetadata->setPrimaryTable(array('name' => $this->prefix . $classMetadata->getTableName()));
foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY
&& isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) {
$mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name'];
$classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
}
}
}
}
}
ok , done