如何前缀序列名? [英] How to prefix sequence names?
问题描述
我知道如何在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中设置表格前缀
-
打开包的资源/ config / services.yml并添加:
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屋!