我有一个实体使用与默认连接使用的数据库不同的数据库,因此我在实体的注释中放置了:
/**
* MyClassName
*
* @ORMTable(name="mytable", schema="`myschema`")
* @ORMEntity(repositoryClass="App...MyClassNameRepository")
*/
class MyClassName
{
...
这是工作。
但我想像这样设置模式:
schema="`%myapp.specificschema%`"
我想这样做是因为我想在生产环境中设置一个不同的数据库名称,并且我只想在一个文件中更改此参数一次。但这似乎是不可能的,因为教义无法访问参数......
提前感谢您的任何回复!
从 n3k 答案升级以管理关联映射
--实体--
/**
* @ORMTable(schema="primary", name="**table_entity_name**", ...)
* @ORMEntity
*/
class Entity
{
/**
* @ORMManyToMany(targetEntity="**pathToEntityManyToMany**" ...)
* @ORMJoinTable(
* schema="secondary",
* name="**table_field_name**",
* joinColumns={@ORMJoinColumn(name="fk_join_***", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="fk_inverse_***", referencedColumnName="id")}
* )
*/
private $fieldManyToMany ;
}
-- SchemaDoctrineSubscriber --
!! getEnvSchemaName(( 用于快速管理模式名称
<?php
namespace AppBundleDoctrine ;
use DoctrineCommonEventSubscriber ;
use DoctrineORMEventLoadClassMetadataEventArgs ;
/**
* Permet de modifier les noms des tables (schemas) depuis les paramètres
*/
class SchemaDoctrineSubscriber implements EventSubscriber
{
/**
* Nom des schemas
*
* string
*/
private $schema_primary ;
private $schema_secondary ;
/**
*
* @param string $schema_primary
* @param string $schema_secondary
*/
public function __construct($schema_primary, $schema_secondary)
{
$this->schema_primary = $schema_primary ;
$this->schema_secondary = $schema_secondary ;
}
/**
* @inheritdoc
*/
public function getSubscribedEvents()
{
return ['loadClassMetadata'] ;
}
/**
* @param LoadClassMetadataEventArgs $eventArgs
*/
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata() ;
// Modifie les schemas des AssociationMappings de l'entité
foreach ($classMetadata->getAssociationMappings() as $key => $associationMapping)
if (isset($associationMapping['joinTable']))
{
$associationMapping['joinTable']['schema'] = $this->getEnvSchemaName($classMetadata->getSchemaName()) ;
$classMetadata->setAssociationOverride($key, $associationMapping) ;
}
// Modifie le schema de l'entité
$classMetadata->table['schema'] = $this->getEnvSchemaName($classMetadata->getSchemaName()) ;
}
/**
* Retourne le nom du schema de l'environnement
*
* @param string $classMetadataSchemaName
*
* @return string
*/
private function getEnvSchemaName($classMetadataSchemaName)
{
switch ($classMetadataSchemaName)
{
case 'primary':
return $this->schema_primary ;
case 'secondary':
return $this->schema_secondary ;
}
}
}
服务.yml
# Permet de modifier les noms des tables (schemas) depuis les paramètres
doctrine.schema_name.subscriber:
class: AppBundleDoctrineSchemaDoctrineSubscriber
arguments: ["%databases.primary.schema.name%", "%databases.secondary.schema.name%"]
tags:
- { name: doctrine.event_subscriber, connection: **main_connection** }
参数.yml
parameters:
databases.primary.schema.name: **primary_schema_name**
databases.secondary.schema.name: **secondary_schema_name**
您可以使用 Doctrine loadMetadata Event 修改架构。
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#load-classmetadata-event
例如,对于订阅者模式,我们应该有这样的东西:
参数.yml
parameters:
schema_name: "my_schema_name"
服务.yml
doctrine.schema_name.subscriber:
class: AppDoctrineSchemaDoctrineSubscriber
arguments: ["%schema_name%"]
tags:
- { name: doctrine.event_subscriber, connection: default }
和相应的类:
use DoctrineCommonEventSubscriber;
use DoctrineORMEventLoadClassMetadataEventArgs;
class SchemaDoctrineSubscriber implements EventSubscriber
{
/** @var string */
private $schemaName;
/**
* SchemaDoctrineSubscriber constructor.
* @param string $schemaName
*/
public function __construct(string $schemaName)
{
$this->schemaName = $schemaName;
}
/**
* @inheritdoc
*/
public function getSubscribedEvents()
{
return array(
'loadClassMetadata',
);
}
/**
* @param LoadClassMetadataEventArgs $eventArgs
*/
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
if ($classMetadata->getTableName() === 'mytable') {
$classMetadata->table['schema'] = $this->schemaName;
}
}
}
然后,您可以在注释中将schema
属性留空,事件将在其上设置良好的值。