PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie werden Sequenznamen vorangestellt?

Basierend auf der Antwort von hier:How to setup table Präfix in symfony2

  1. Öffnen Sie die Resources/config/services.yml Ihres Bundles und fügen Sie hinzu:

    parameters:
        mybundle.db.sequence_prefix: myprefix_
    
  2. Neuen Dienst hinzufügen:

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

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

Die Dokumentation sagt READ-ONLY für die sequenceGeneratorDefinition Eigenschaft, daher denke ich, dass es sauberer ist, den Setter zu verwenden, als den Wert manuell zu ändern (aber es gibt keinen Getter, also verwenden wir einfach den öffentlichen Eigenschaftswert).