can*_*nni 19 php symfony doctrine-orm
就像问题主题一样,我如何在symfony2中设置默认表格前缀?
对于所有实体,默认情况下可以设置为最佳,但可以选择覆盖单个实体.
sim*_*aun 46
刚刚想到这一点,我想详细说明如何实现这一目标.
Symfony 2&Doctrine 2.1
注意:我使用YML进行配置,这就是我要展示的内容.
打开你的bundle的Resources/config/services.yml
定义表前缀参数:
确保更改 mybundle和myprefix_
parameters:
mybundle.db.table_prefix: myprefix_
Run Code Online (Sandbox Code Playgroud)添加新服务:
services:
mybundle.tblprefix_subscriber:
class: MyBundle\Subscriber\TablePrefixSubscriber
arguments: [%mybundle.db.table_prefix%]
tags:
- { name: doctrine.event_subscriber }
Run Code Online (Sandbox Code Playgroud)创建MyBundle\Subscriber\TablePrefixSubscriber.php
<?php
namespace MyBundle\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();
if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) {
// if we are in an inheritance hierarchy, only apply this once
return;
}
$classMetadata->setTableName($this->prefix . $classMetadata->getTableName());
foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY
&& array_key_exists('name', $classMetadata->associationMappings[$fieldName]['joinTable']) ) { // Check if "joinTable" exists, it can be null if this field is the reverse side of a ManyToMany relationship
$mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name'];
$classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)postgres用户的可选步骤:为序列做类似的事情
Mih*_*ncu 11
这是一个考虑到Doctrine2中可用的新功能的更新.
Doctrine2使用NamingStrategy实现从类名到表名或从属性名到列名的转换的类.
该DefaultNamingStrategy只是为了推导出表名称查找"短类名"(不带其命名空间).
在UnderscoreNamingStrategy做同样的事情,但它也小写字母和"underscorifies""短类名".
您的CustomNamingStrategy类可以扩展上述任何一个(如您所见)并覆盖classToTableName和joinTableName方法,以允许您指定应如何构造表名(使用前缀).
例如,我的CustomNamingStrategy类扩展了UnderscoreNamingStrategy并根据命名空间约定找到了包名称,并将其用作所有表的前缀.
在Symfony2中使用上述内容需要将您的CustomNamingStragery类声明为服务,然后在您的配置中引用它:
doctrine:
# ...
orm:
# ...
#naming_strategy: doctrine.orm.naming_strategy.underscore
naming_strategy: my_bundle.naming_strategy.prefixed_naming_strategy
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
| 归档时间: |
|
| 查看次数: |
15202 次 |
| 最近记录: |