IsUnique 规则变更说明

如果您在可为空的列上具有唯一索引,您可能已经注意到 CakePHP 4 中 IsUnique 应用程序规则的一些令人困惑的更改。

在 CakePHP 3 中,IsUnique 具有一个名为 allowMultipleNulls 的选项,其默认值为 true。此选项控制是否将 NULL 值视为唯一。如果它们是唯一的,则当任何字段包含 NULL 值时,该规则将返回 true。

当 CakePHP 4 发布时,allowMultipleNulls 选项由于沟通不畅而被移除。这会导致如果一行匹配包含 NULL 值的字段,则 IsUnique 失败。

但是,这个问题在 CakePHP 4.2 中被发现并重新引入了该选项,但采用了不同的实现方式。由于版本发布的向后兼容规则,默认值被设置为 false,因为 CakePHP 4.0 中没有它。

在应用程序规则中烘焙 allowMultipleNulls

Bake 2.6 将自动为任何包含可为空列的唯一索引添加 allowMultipleNulls 选项。对于除 SQL Server 之外的所有数据库,此选项将设置为 true。这应该让用户更容易理解行为并知道在哪里更改选项。

您应该看到生成的唯一规则类似于以下内容

$rules->add($rules->isUnique(['field_1', 'field_2'], ['allowMultipleNulls' => true]), ['errorField' => 'field_1']);

对于像这样的规则,总有一些极端情况。一些用户可能具有可为空的列,但保持唯一空值。一些用户可能有一个解决方案,可以让 SQL Server 将 NULL 视为唯一的。我们的目标是提供合理且可靠的默认值。

注意

Bake 2.6 还包括对使用多个字段烘焙唯一规则的支持。

CakePHP 5 的更改

我们理解,更改隐藏选项的默认行为会导致混淆,但我们认为需要以正确的方式进行更正。

CakePHP 5 将将此行为的默认值改回允许多个 NULL 值。

通过以上对 Bake 的更改,这应该不会对行为造成重大影响。