【问题标题】:Doctrine2 generating INSERT statement that overrides SQL default valueDoctrine2 生成覆盖 SQL 默认值的 INSERT 语句
【发布时间】:2013-10-01 08:42:03
【问题描述】:

我遇到了in this post 解释的类似问题,但提供的解决方案不适用于我的情况。问题来了……

我正在使用 Symfony2,它使用 Doctrine2 作为 ORM,将新用户插入数据库。当我使用对象方法插入用户时,会在我不想插入任何内容的字段中插入一个空值(因此将插入默认值)。

这就是我希望生成的 INSERT 语句的外观:

INSERT into mytable (name) VALUES (?)
array(1) {
  [1]=>
  string(6) "myName"
}

这就是 Doctrine 创建 INSERT 语句的方式

INSERT into mytable (name, token, creationDate) VALUES (?,?,?)
array(3) {
  [1]=>
  string(6) "myName"
  [2]=>
  NULL
  [3]=>
  NULL
}

令牌应该有一个使用 postgresql 的 uuid_generate_v5 方法定义的默认值。 creationDate 的默认值应该是 now()。教义插入的 NULL 值会覆盖这些默认值。

有什么方法可以让教义忽略插入时的某些字段?

【问题讨论】:

  • 你可以把默认值放在你模型对象的构造函数中。
  • @Nanocom +1 对于使用 Doctrine 2 映射的字段,您不应将默认值放入数据库中。将默认值放入构造函数中,或直接放入您的字段声明中。
  • 谢谢。我没有使用构造函数的原因是因为有其他应用程序在使用这个数据库,并且它们使用数据库中的默认值。使用相同的方法生成令牌会很好。但如果不可能,那么我可能需要研究其他选项。谢谢

标签: php postgresql symfony doctrine-orm


【解决方案1】:

尝试在列注释中显式使用 nullable=false 属性。

【讨论】:

  • 您数据库中的字段是否为 NOT NULL?
  • 我在数据库字段上尝试了 NOT NULL,但我得到了一个“Not null冲突”,因为它仍在插入 NULL。
  • 如果变量为null,你认为Lifecycle回调可以使用吗?
  • 创建日期就可以了,但是代币的生成是我比较关心的。理想情况下,无论哪个应用程序触发了令牌,都应该使用相同的方法来生成令牌。
猜你喜欢
  • 2020-04-17
  • 2014-05-06
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多