gpt4 book ai didi

MySQL/Doctrine : allowing null fields on insert, 但未更新

转载 作者:行者123 更新时间:2023-11-29 07:17:40 25 4
gpt4 key购买 nike

有时需要创建一个包含一些未定义字段的实体,但要防止在后续更新时存储未定义的值。例如,下面示例中的用户实体必须在解析“名称”字段的值之前持久化。创建后,仅当名称字段不为空时才应再次持久化。

/**
* @ORM\Entity()
*/
class User
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id; //autoincrement

/**
* @ORM\Column(type="string")
*/
private $name; //null at the time of creation

/**
* @ORM\Column(type="date")
*/
private $birthday; //null at the time of creation
}

使用空名称字段保留上述实体将导致“列不能为空”SQL 错误。理想情况下,会有两个独立的“NOT NULL ON INSERT”和“NOT NULL ON UPDATE”约束。由于情况并非如此,因此必须使用其他解决方案。

  • 一个简单的解决方案是从表中删除“非空”约束以允许空插入和
    在 PHP 端验证实体以防止在更新时设置空值。这种方法需要额外的努力和关注。
  • 另一种解决方案是定义非空默认值代表'undefined',比如$name='', $birthday=new Date('1900-01-01')。但是这个在使用它们之前需要将这些值转换为空(例如,显示用于设置实际名称和日期的表单)。
  • 另一种解决方案是创建“EntityData”对象并添加
    可为空的 OneToOne 关系。这非常酷,因为对整个组而不是单个字段放宽了 not null 约束。但是,这需要为用户创建单独的表/实体
    身份及其内容。

关于如何最好地处理这些情况还有其他想法吗?

最佳答案

您可以使用 doctrine ORM 中的 preUpdate 事件来检查属性是否不同于 null。

        /** @PreUpdate */
public function doStuffOnPreUpdate()
{
$this->value = 'changed from preUpdate callback!';
}

您还必须考虑在实体上添加 @HasLifecycleCallbacks 注释。文档链接: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html#lifecycle-events

关于MySQL/Doctrine : allowing null fields on insert, 但未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com