【问题标题】:Doctrine boolean type can't be set to falseDoctrine 布尔类型不能设置为 false
【发布时间】:2018-04-26 22:56:44
【问题描述】:

我无法将false 值设置为类型为boolean 的实体列。

/**
 * @ORM\Column(type="boolean")
 */
private $isActive;

发送 JSON:

{myEntity: {isActive: false}}

...将导致:

违反完整性约束:1048 列“is_active”不能为空

发送时:

{myEntity: {isActive: 0}}

...会正常工作

stackoverflow 上有一些类似的答案,但是没有一个解决方案有效。

原始列

+--------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra           |
+-------------+--------------+------+-----+---------+-----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment  |
| is_active   | tinyint(1)   | NO   |     | NULL    |                 |
+-------------+--------------+------+-----+---------+-----------------+

编辑

在下面阅读我的答案。这不是 Doctrine 错误,而是 MariaDB 10.2 系列。

【问题讨论】:

  • 请显示处理调用的控制器和表单类型。与实体设置器一起。但是,如果不允许 null,我建议指定一个默认值。
  • 问题不在于控制器或表单类型。问题在于 Doctrine 本身或 DBAL。

标签: doctrine boolean mariadb nullable


【解决方案1】:

不幸的是,这不是主要问题的解决方案,但它会提供一些见解。

false 转换为null 的问题出现在 MariaDB 10.2 系列(未测试 10.0 系列)。

上述问题在 MySQL 或 MariaDB 5.5 系列上不会发生,它以正确的方式将 false 转换为 false

将专门针对 MariaDB 10.2 错误提出另一个问题。

【讨论】:

【解决方案2】:

或者,你应该评估做:

/**
 * @ORM\Column(type="boolean", nullable=true)
 */
private $isActive;

您不会总是有机会和/或想要在类中初始化一个值。

更新:

我意识到我的答案不是正确的。也许您可以在构造函数中初始化属性,或者自动调用 setter。在任何情况下,您都必须“欺骗”您的实体已更改的 Doctrine 工作单元。

【讨论】:

  • 这没有回答问题,他可能不希望布尔值能够为空。
  • 是的,他可能,这就是为什么是另一种选择。无论如何,我意识到问题在于该实体没有针对学说的工作单元进行更新。这是另一个问题。
  • 您的解决方案会起作用,因为您明确表示 isActive 可能为 null 并且它会起作用,但是我仍在寻找一种方法来发送 false 并且这必须起作用
猜你喜欢
  • 2013-12-19
  • 2019-12-11
  • 2016-07-04
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多