如何在 symfony2 中设置表前缀指示替代答案
2022-08-30 20:20:02
就像在有问题的主题中,我如何在symfony2中设置默认表前缀?
最好是默认为所有实体设置它,但可以选择覆盖单个实体。
就像在有问题的主题中,我如何在symfony2中设置默认表前缀?
最好是默认为所有实体设置它,但可以选择覆盖单个实体。
我自己刚刚弄清楚了这一点,我想就如何实现这一目标有所了解。
Symfony 2 & Doctrine 2.1
注意:我使用YML进行配置,这就是我将要展示的内容。
打开捆绑包的资源/配置/服务.yml
定义表前缀参数:
请务必更改 mybundle 并myprefix_
parameters:
mybundle.db.table_prefix: myprefix_
添加新服务:
services:
mybundle.tblprefix_subscriber:
class: MyBundle\Subscriber\TablePrefixSubscriber
arguments: [%mybundle.db.table_prefix%]
tags:
- { name: doctrine.event_subscriber }
创建 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;
}
}
}
}
postgres 用户的可选步骤:对序列执行类似操作
这是一个考虑到 Doctrine2 中可用较新功能的更新。
Doctrine2 使用实现从类名到表名或从属性名到列名的转换的类。NamingStrategy
只需查找“短类名”(不带其命名空间)即可推断表名。DefaultNamingStrategy
做同样的事情,但它也小写和“欠修饰”“短类名称”。UnderscoreNamingStrategy
您的类可以扩展上述任一(只要您认为合适),并重写 and 方法,以允许您指定应如何构造表名(使用前缀)。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
优点:
缺点: