postgresql - 如何为序列名称添加前缀?

标签 postgresql symfony doctrine-orm

<分区>

我知道how to set up a table prefix in symfony2 ,但现在我想对 postgres 序列做同样的事情。我怎样才能做到这一点?这可能吗?

最佳答案

基于此处的答案:How to setup table prefix in symfony2

  1. 打开您的包的 Resources/config/services.yml 并添加:

    parameters:
        mybundle.db.sequence_prefix: myprefix_
    
  2. 添加新服务:

    services:
        mybundle.sqprefix_subscriber:
            class: MyBundle\Subscriber\SequencePrefixSubscriber
            arguments: [%mybundle.db.sequence_prefix%]
            tags:
                - { name: doctrine.event_subscriber }
    
  3. 创建 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 属性说明了 READ-ONLY 所以我认为使用 setter 比手动更改值更干净(但是没有 getter 所以我们只需使用公共(public)属性值)。

关于postgresql - 如何为序列名称添加前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19380177/

相关文章:

postgresql - 如何将 HashMap 作为 JSON 类型插入到 PostgreSQL 中?

sql - 如何在 SQL 中获取 "top X with the rest"?

node.js - 未处理的拒绝 SequelizeConnectionRefusedError : connect ECONNREFUSED 127. 0.0.1:5432 with dockers

php - 可捕获的 fatal error : Object of class Proxies\__CG__\AppBundle\Entity\Ticket could not be converted to string

php/symfony2 从 URL 中隐藏 app.php

php - 如何将 Symfony 参数解析为 Alice 的 fixtures.yml 文件

php - 学说实体 "Class not found"

php - 学说 2 @joincolumns

sql - 临时表postgresql函数

doctrine-orm - Symfony - 在 INSERT、UPDATE 或 DELETE 中以不同方式验证实体