如何前缀序列名? [英] How to prefix sequence names?

查看:117
本文介绍了如何前缀序列名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道如何在symfony2中设置表前缀 ,但是现在我想对postgres序列做同样的事情。我该怎么做?这是可能的吗?

I know how to set up a table prefix in symfony2, but now I'd like to do the same for postgres sequences. How can I do this? Is this even possible?

推荐答案

根据这里的答案:如何在symfony2中设置表格前缀


  1. 打开包的资源/ config / services.yml并添加:

  1. Open up your bundle's Resources/config/services.yml and add:

parameters:
    mybundle.db.sequence_prefix: myprefix_


  • 添加新服务:

  • Add a new service:

    services:
        mybundle.sqprefix_subscriber:
            class: MyBundle\Subscriber\SequencePrefixSubscriber
            arguments: [%mybundle.db.sequence_prefix%]
            tags:
                - { name: doctrine.event_subscriber }
    


  • 创建MyBundle\Subscriber\SequencePrefixSubscriber.php

  • Create MyBundle\Subscriber\SequencePrefixSubscriber.php

    <?php
    namespace MyBundle\Subscriber;
    
    use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
    
    class SequencePrefixSubscriber 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()) {
                return;
            }
    
    
            if ($classMetadata->isIdGeneratorSequence())
            {
                $newDefinition = $classMetadata->sequenceGeneratorDefinition;
                $newDefinition['sequenceName'] = $this->prefix . $newDefinition['sequenceName'];
    
                $classMetadata->setSequenceGeneratorDefinition($newDefinition);
                $em = $args->getEntityManager();
                if (isset($classMetadata->idGenerator)) {
                    $sequenceGenerator = new \Doctrine\ORM\Id\SequenceGenerator(
                        $em->getConfiguration()->getQuoteStrategy()->getSequenceName(
                            $newDefinition,
                            $classMetadata,
                            $em->getConnection()->getDatabasePlatform()),
                        $newDefinition['allocationSize']
                    );
                    $classMetadata->setIdGenerator($sequenceGenerator);
                }
            }
        }
    }
    


  • 参考: http://www.doctrine-project.org/api/orm/2.0/class-Doctrine.ORM.Mapping.ClassMetadataInfo.html

    文档说只读 sequenceGeneratorDefinition 属性,所以我认为使用setter比较干净手动更改值(但是没有getter,所以我们只使用公共属性值)。

    The documentation says READ-ONLY for the sequenceGeneratorDefinition property so I think it is cleaner to use the setter than changing the value manually (but there is no getter so we just use the public property value).

    这篇关于如何前缀序列名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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