如何在symfony2中设置表前缀 [英] How to setup table prefix in symfony2
问题描述
像问题主题一样,如何在symfony2中设置默认表前缀?
Like in question topic, how can I setup default table prefix in symfony2?
如果可以为所有实体默认设置最佳,但选项为
The best if it can be set by default for all entities, but with option to override for individual ones.
推荐答案
刚刚想出了这一点,我想清楚一下如何完成这个。
Having just figured this out myself, I'd like to shed some light on exactly how to accomplish this.
Symfony 2& Doctrine 2.1
注意:我使用YML进行配置,所以这就是我要显示的。
Symfony 2 & Doctrine 2.1
Note: I use YML for config, so that's what I'll be showing.
-
打开您的软件包的资源/ config / services.yml
Open up your bundle's Resources/config/services.yml
定义表前缀参数:
请确保更改mybundle em> myprefix _
Define a table prefix parameter:
Be sure to change mybundle and myprefix_
parameters:
mybundle.db.table_prefix: myprefix_
添加新服务:
Add a new service:
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;
}
}
}
}
这篇关于如何在symfony2中设置表前缀的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!