您可以通过使用侦听器/订阅者连接到学说事件系统来动态调整表名(和映射)。
即“loadClassMetadata”是您可以创建监听器/订阅者的学说事件之一,如食谱文章如何注册事件监听器和订阅者中所述。
例子
config.yml
services:
mapping.listener:
class: Acme\YourBundle\EventListener\MappingListener
tags:
- { name: doctrine.event_listener, event: loadClassMetadata }
MappingListener
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
class MappingListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
$table = $classMetadata->table;
$oldName = $table['name']; // ... or $classMetaData->getTableName()
// your logic here ...
$table['name'] = 'new_table_name';
$classMetadata->setPrimaryTable($table);
// ... or add a field-mapping like this
$fieldMapping = array(
'fieldName' => 'about',
'type' => 'string',
'length' => 255
);
$classMetadata->mapField($fieldMapping);
ClassMetadata扩展了ClassMetadataInfo并提供了一个公共变量“表”(包含您的注释或 yml 提供的映射信息),您可以对其进行修改!
公共表变量是一个包含以下条目的数组:
- 名字 =>
- 架构 =>
- 索引 => 数组
- 唯一约束 => 数组
您可以在保存/更新之前在控制器中动态注册事件侦听器/订阅者。
$mappingListener = new MappingListener();
// ... maybe even modify the listener using reflection
$evm = $this->get('doctrine')->getManager()->->getEventManager();
$evm->addEventListener('loadClassMetadata', $mappingListener);
此外,您可以引入多个数据库连接/名称并在您的应用程序中访问它们。
应用程序/配置/config.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
customer:
driver: "%database_driver2%"
host: "%database_host2%"
port: "%database_port2%"
dbname: "%database_name2%"
user: "%database_user2%"
password: "%database_password2%"
charset: UTF8
然后使用...获取不同的实体管理器
$em = $this->get('doctrine')->getManager('default');
$em2 = $this->get('doctrine')->getManager('customer');
或存储库
$customers = $this->get('doctrine')
->getRepository('AcmeCustomerBundle:Customer', 'customer')
->findAll()
;
...或动态添加连接
$this->get('doctrine')
->connection('mysql://username:password@localhost/test', 'dynamic_connection');
在食谱章节如何使用多个实体管理器和连接中阅读有关该主题的更多信息。