sql >> Databáze >  >> RDS >> PostgreSQL

Jak předponovat názvy sekvencí?

Na základě odpovědi odtud:Jak nastavit tabulku prefix v symfony2

  1. Otevřete Resources/config/services.yml svého balíčku a přidejte:

    parameters:
        mybundle.db.sequence_prefix: myprefix_
    
  2. Přidat novou službu:

    services:
        mybundle.sqprefix_subscriber:
            class: MyBundle\Subscriber\SequencePrefixSubscriber
            arguments: [%mybundle.db.sequence_prefix%]
            tags:
                - { name: doctrine.event_subscriber }
    
  3. Vytvořte 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);
                }
            }
        }
    }
    

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

Dokumentace říká READ-ONLY pro sequenceGeneratorDefinition property, takže si myslím, že je čistší použít setter než měnit hodnotu ručně (ale neexistuje žádný getter, takže používáme pouze hodnotu veřejné vlastnosti).




  1. Nahraďte srovnání se skalárním poddotazem vnitřním spojením nebo levým/pravým spojením

  2. Jak vyvolat vlastní chybu Postgresql a zpracovat ji v Ecto

  3. SQL Server porovnání data a času v různých formátech

  4. Jaké uživatelské jméno a heslo je třeba zadat při připojení k SQL*Plus po instalaci Oracle 11g?