有时需要创建一个包含一些未定义字段的实体,但要防止在后续更新中存储未定义的值。例如,在解析"name"字段的值之前,必须保留以下示例中的 User 实体。创建后,仅当名称字段不为 null 时,才应再次保留它。
/**
* @ORMEntity()
*/
class User
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id; //autoincrement
/**
* @ORMColumn(type="string")
*/
private $name; //null at the time of creation
/**
* @ORMColumn(type="date")
*/
private $birthday; //null at the time of creation
}
使用空名称字段保留上述实体将导致"列不能为空"SQL 错误。理想情况下,将有两个单独的"插入时不为空"和"更新时不为空"约束。由于情况并非如此,因此必须使用其他解决方案。
- 一个简单的解决方案是从表中删除"非空"约束以允许空插入并在
PHP 端验证实体,以防止在更新时设置 null 值。这种方法需要额外的努力和照顾。 - 另一种解决方案是定义不为空的默认值,这些默认值将 代表"未定义",如$name=",$birthday=新日期('1900-01-01'(。但是这个 在使用之前需要将这些值转换为空 (例如,显示用于设置实际名称和日期的表单(。
- 另一种解决方案是创建"实体数据"对象并添加
可为空的一对一关系。这很酷,因为对整个组而不是单个字段放宽了非空约束。 但是,这需要为用户
标识及其内容创建单独的表/实体。
关于如何最好地处理这些案件还有其他想法吗?
您可以使用 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