2016-08-11 7 views
2

アプリケーションのテーブル接頭辞名が必要です。私はそれが必要ではないと思っていますが、ユーザーはユーザーです。あなたは何の移行を持っていないか(クエリビルダを使用して)手動でクエリーを書いていない場合、これはうまく動作します接頭辞付きSymfony Doctrine(マイグレーション)

services: 
app.event.doctrine.table_prefix_subscriber: 
class: RYZ\Bundle\CoreBundle\EventListener\TablePrefixSubscriber 
arguments: ['%database_prefix%'] 
tags: 
    - { name: doctrine.event_subscriber } 

:私たちはこのTablePrefix加入

class TablePrefixSubscriber implements \Doctrine\Common\EventSubscriber { 
protected $prefix = ''; 
public function __construct($prefix = '') { 
    $this->prefix = (string) $prefix; 
} 
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) { 
    $classMetadata = $eventArgs->getClassMetadata(); 
    if(strlen($this->prefix)) { 
     if(0 !== strpos($classMetadata->getTableName(), $this->prefix)) { 
      $classMetadata->setTableName($this->prefix . $classMetadata->getTableName()); 
     } 
    } 
    foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { 
     if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY) { 
      if(!isset($classMetadata->associationMappings[$fieldName]['joinTable'])) { continue; } 
      $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name']; 
      if(0 !== strpos($mappedTableName, $this->prefix)) { 
       $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; 
      } 
     } 
    } 
} 
public function getSubscribedEvents() { 
    return array('loadClassMetadata'); 
} 

サービスの構成を有している瞬間に 。

doctrineの移行でクエリにプレフィックスを追加する方法はわかりません。

移行でプレフィックス設定変数database_prefixにアクセスしてすべてのクエリに追加するだけで問題ありません。

また、Entityリポジトリクラスの変数にアクセスします。

誰かが私を正しい方向に向けることができれば嬉しいです。

更新:私はDoctrine Naming Strategyについて聞いたことがありますが、私がここで助けにならないと思いますか?あなたのマイグレーションクラスにContainerAwareInterfaceを実装し、ちょうどあなたが実装されているすべてのパラメータおよびサービスにアクセスすることができますContainerAwareInterface

: キーワード:(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/namingstrategy.html

答えて

0

わかりました私は、移行のためのソリューションを見つけたと思います。素晴らしいこと!ここで

は一例です:

<?php 

namespace FooBla\Migrations; 

use Doctrine\DBAL\Migrations\AbstractMigration; 
use Doctrine\DBAL\Schema\Schema; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class Version20160810121166 extends AbstractMigration implements ContainerAwareInterface 
{ 
    private $container; 

public function setContainer(ContainerInterface $container = null) 
{ 
    $this->container = $container; 
} 

/** 
* @param Schema $schema 
*/ 
public function up(Schema $schema) 
{ 
    $em = $this->container->getParameter('database_prefix'); //Just use the parameter directly in the migration calls 
    $this->addSql('CREATE TABLE `'.$em.'sessions` (`sess_id` VARBINARY(128) NOT NULL PRIMARY KEY, `sess_data` BLOB NOT NULL, `sess_time` INTEGER UNSIGNED NOT NULL, `sess_lifetime` MEDIUMINT NOT NULL) COLLATE utf8_bin, ENGINE = InnoDB'); 
} 

/** 
* @param Schema $schema 
*/ 
public function down(Schema $schema) 
{ 
} 
} 
関連する問題