如何在 symfony2 中设置表前缀 [英] How to setup table prefix in symfony2

查看:28
本文介绍了如何在 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 &教义 2.1
注意:我使用 YML 进行配置,所以这就是我要展示的内容.

  1. 打开你的包的Resources/config/services.yml

定义一个表前缀参数:
一定要改变mybundlemyprefix_

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: MyBundleSubscriberTablePrefixSubscriber
            arguments: [%mybundle.db.table_prefix%]
            tags:
                - { name: doctrine.event_subscriber }
    

  • 创建MyBundleSubscriberTablePrefixSubscriber.php

    <?php
    namespace MyBundleSubscriber;
    
    use DoctrineORMEventLoadClassMetadataEventArgs;
    
    class TablePrefixSubscriber implements DoctrineCommonEventSubscriber
    {
        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'] == DoctrineORMMappingClassMetadataInfo::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 用户的可选步骤:对序列做一些类似的事情

    这篇关于如何在 symfony2 中设置表前缀的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆