PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak prefiksować nazwy sekwencji?

Na podstawie odpowiedzi z tego miejsca:Jak ustawić tabelę prefiks w symfony2

  1. Otwórz Resources/config/services.yml swojego pakietu i dodaj:

    parameters:
        mybundle.db.sequence_prefix: myprefix_
    
  2. Dodaj nową usługę:

    Usługi
    services:
        mybundle.sqprefix_subscriber:
            class: MyBundle\Subscriber\SequencePrefixSubscriber
            arguments: [%mybundle.db.sequence_prefix%]
            tags:
                - { name: doctrine.event_subscriber }
    
  3. Utwórz 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);
                }
            }
        }
    }
    

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

Dokumentacja mówi READ-ONLY dla sequenceGeneratorDefinition więc myślę, że czystsze jest użycie settera niż ręczna zmiana wartości (ale nie ma gettera, więc po prostu używamy wartości właściwości publicznej).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jednostki asocjacyjne DB i indeksowanie

  2. znak 0xc286 kodowania UTF-8 nie ma odpowiednika w WIN1252... Przy konwersji z iconv postgres przywraca awarię

  3. Jak uzyskać plan wykonania dla uruchomionego zapytania w postgresql?

  4. Nie wiem, jak Postgresql stworzył użytkownika na moim Macu

  5. Wiosenna aktualizacja JdbcTemplate kolumna geografii Postgis