php 在原则2中手动生成下一个序列值

xriantvc  于 2022-12-02  发布在  PHP
关注(0)|答案(4)|浏览(144)

对于给定名称的特定序列,生成nextval的最简单方法是什么?
标注解决方案与指定

* @ORM\GeneratedValue(strategy="SEQUENCE")
 * @ORM\SequenceGenerator(sequenceName="sq_foobar", allocationSize="1", initialValue="1")

只要有更复杂的逻辑在里面在某些情况下,我需要检索nextval,在其他情况下,我将使用从其他源(而不是序列)检索的值。
所以我希望有一种方法可以在实体的构造函数中手动检索序列nextval。

xsuvu9jc

xsuvu9jc1#

以防万一别人也提出这个问题(就像我一样):
@Florian提到的pull请求现在已经成为了教条。虽然文档似乎仍然缺乏CUSTOMid生成器策略的任何信息。我发现只有在GeneratedValue描述中提到了IdGenerator的CUSTOM选项。如果我错过了,请在评论中更正我。
坚韧很容易实现,只需创建一个扩展Doctrine\ORM\Id\AbstractIdGenerator的类:

namespace My\Namespace;
use Doctrine\ORM\Id\AbstractIdGenerator;
class MyIdGenerator extends AbstractIdGenerator
{
    public function generate(\Doctrine\ORM\EntityManager $em, $entity)
    {
        // Create id here
        $id = <do some logic>;
        return $id;
    }
}

然后将其添加到条令实体配置中的id描述中(YAML示例):

My\Bundle\Entity\MyEntity:
    type: entity
    id:
        id:
            type: bigint
            unique: true
            generator:
                strategy: CUSTOM
            customIdGenerator:
                class: 'My\Namespace\MyIdGenerator'
    fields:
        otherField: ....

如果使用Annotations而不是YAML,实体配置应如下所示(未测试):

/**
  * @Id 
  * @Column(type="integer")
  * @GeneratedValue(strategy="CUSTOM")
  * @CustomIdGenerator(class="My\Namespace\MyIdGenerator")
  */
  public $id;

这就是所有;)

r7knjye2

r7knjye22#

在教义2中,有两种可能性得到序列nextval:
1.使用Doctrine ORM序列生成器

use Doctrine\ORM\Id\SequenceGenerator;
$sequenceName = 'file_id_seq';
$sequenceGenerator = new SequenceGenerator($sequenceName, 1);
$newId = $sequenceGenerator->generate($entityManager, $entity);
// $entity in this case is actually not used in generate() method, so you can give any empty object, or if you are not worried about editor/IDE warnings, you can also specify null

1.使用本机SQL

$sequenceName = 'file_id_seq';
$dbConnection = $entityManager->getConnection();
$nextvalQuery = $dbConnection->getDatabasePlatform()->getSequenceNextValSQL($sequenceName);
// $nextvalQuery is now following string "SELECT NEXTVAL('file_id_seq')"
$newId = (int)$dbConnection->fetchColumn($nextvalQuery);
qvtsj1bj

qvtsj1bj3#

那么我认为你应该实现你自己的Identifer生成器。
最简单的方法是覆盖Doctrine\ORM\Id\SequenceGenerator类来处理您的特定情况。
然后,您必须使用Doctrine ORM API在类元数据中注册此生成器。
部分链接:http://ranskills.wordpress.com/2011/05/26/how-to-add-a-custom-id-generation-strategy-to-doctrine-2-1/
https://github.com/doctrine/doctrine2/pull/206

yfjy0ee7

yfjy0ee74#

我有symfony 6与教条形式2.13和工程代码,在SomeEntityRepository创建的函数:

public function fetchSeqId(EntityManagerInterface $entityManager){
    $dbConnection = $entityManager->getConnection();
    $nextValQuery = $dbConnection->getDatabasePlatform()->getSequenceNextValSQL('some_id_seq');        
    $id = (int) $dbConnection->executeQuery($nextValQuery)->fetchOne();
    return $id;
}

且在控制器中用作:

$repository = $this->entityManager->getRepository(SomeEntity::class);
$id= $repository->fetchSeqId($this->entityManager);

相关问题