在学说 2 中手动生成下一个序列值

2022-08-30 23:54:29

为具有给定名称的特定序列生成的最简单方法是什么?nextval

具有指定

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

这并不满足我,只要涉及一些更复杂的逻辑:在某些情况下,我需要检索,在其他情况下 - 我会使用从另一个来源(不是序列)检索的值。nextval

所以我希望有一种方法可以在实体的构造函数中手动检索序列nextval。


答案 1

以防其他人在这个问题上(就像我一样):
@Florian提到的拉取请求现在已经变成了教义。尽管文档似乎仍然缺少有关自定义 ID 生成器策略的任何信息。我只找到提到IdGenerator选项的部分是在GenerationValue描述中。如果我错过了它,请在评论中纠正我。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;
    }
}

然后将其添加到教义实体配置(示例)中的描述中:idYAML

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

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

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

这就是;)


答案 2

在 Doctrine2 中,有两种获得序列 nextval 的可能性:

  1. 使用原则 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
    
  2. 使用本机 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);
    

推荐