【问题标题】:Doctrine not creating auto UUID教义不创建自动 UUID
【发布时间】:2023-03-03 08:10:24
【问题描述】:

我遇到了麻烦。当我在 Symfony 中执行 persist() 和 flush() 时,我得到了这个:

执行 'INSERT INTO pedido (emissao, 总计,cliente_id) VALUES (?, ?, ?, ?)' with params ["2018-01-10", "100.00", "65c4002a-06e2-442b-b1da-61197f73ba3b"]: SQLSTATE[HY000]: 一般错误: 1364 字段 'id' 没有默认值

我的注解在所有实体中都是一样的,但是在这一个中(具体来说),Doctrine 无法创建自动 id:

/**
 * @var \Ramsey\Uuid\Uuid
 *
 * @ORM\Id
 * @ORM\Column(type="uuid", unique=true)
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
 */
protected $id;

由于字段 ID 是自动生成的,因此此错误似乎没有任何意义。我还有其他实体,例如 Pessoa,它们可以在相同的注释下正常工作。

如何强制 Doctrine “理解” UUID 索引?

【问题讨论】:

  • 此实体中是否还有其他带有 ID 生成器的属性?
  • 是的,有一个“codigo”(代码)。但它是一个自动增量生成器 (int),而不是 UUID。

标签: php sql symfony doctrine-orm doctrine


【解决方案1】:

当前 Doctrine 不支持在单个实体中自动生成多个字段。如果有 2 个字段,Doctrine 将为最后一个字段生成值,并为第一个字段生成默认值(null,如果未指定)。

由于 Ramsey 使用静态方法来生成 UUID,因此您应该将它的生成放置在持久逻辑所在的位置(管理器、处理程序或其他)或实体的构造函数中:

public function __construct()
{
    $this->uuid = Uuid::uuid4()->toString();
}

并移除相应的注解:

* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")

另一种解决方案

由于您的第二列使用数据库的自动增量功能(我假设您使用的是 MySQL),您可以尝试:

  1. 删除此列上的生成器注释
  2. 使用AUTO_INCREMENT 选项手动定义列定义(恕我直言,不可移植和hacky):
    1. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#column
    2. https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html

【讨论】:

  • 第二种解决方案效果更好。我尝试创建一个类来生成 autoID,但正在执行一些查询来获取最后一个 ID,这没有任何意义:P 谢谢!
  • 在构造函数中手动生成uuid是否省事?如果从 db 加载实体(使用现有 uuid)会发生什么?那么我是否需要 uuid 字段的公共 setter 方法?
  • 如果从 db 加载实体,则不会调用构造函数。
【解决方案2】:

你需要:

  1. 检查,表pedido 中的字段id 是自增主键。

  2. VALUES (?, ?, ?, ?) 更改为 VALUES (?, ?, ?),因为您只插入了 3 个值

【讨论】:

  • 它是一个 UUID 生成器,而不是自动增量器:/
猜你喜欢
  • 1970-01-01
  • 2022-11-29
  • 2016-03-19
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多