gpt4 book ai didi

php - CakePHP 3 Multiple isUnique 允许 NULL 重复

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:49 25 4
gpt4 key购买 nike

我的 BlockedTable.php 中有以下规则

public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['date', 'time']),
['message' => 'unique error']);

return $rules;
}

到目前为止,这一直运行良好 - 如果我尝试使用已有的日期和时间保存新记录,它会阻止我保存。

但是,如果我的时间是NULL,比如下面的条目;

╔════╦══════════════╦═══════╗
║ ID ║ Date ║ Time ║
╠════╬══════════════╬═══════╣
║ 1 ║ 22/08/1985 ║ NULL ║
╚════╩══════════════╩═══════╝

该规则仍然允许我保存具有相同数据的新条目。因此,如果我尝试保存 $date = 22/08/1985$time = NULL,它可以很好地保存并且我的数据库中有重复记录。由于上述规则,我预计它会失败吗?

为什么会这样?以及如何防止 NULL 值出现重复条目​​?

在此先感谢您的帮助。

最佳答案

使用普通比较运算符与 NULL 进行比较,即 column = NULL(唯一规则所做的),应始终为 NULL(AFAIK至少在 MySQL 和 Postgres 中是这种情况),因此没有找到任何东西,因此只要涉及 NULL 值,唯一检查就会通过。

如果您想阻止这种行为,您必须使用自定义规则,因为内置规则根本不支持它。我认为这是值得改进的地方,所以你可能想开票over at GitHub .

这是一个覆盖 IsUnique 规则类的基本示例,它基本上只是向条件键添加一个 IS 运算符,以便 NULL检查结果为 column IS NULL

public function __invoke(EntityInterface $entity, array $options)
{
if (!$entity->extract($this->_fields, true)) {
return true;
}

$alias = $options['repository']->alias();
$conditions = $this->_alias($alias, $entity->extract($this->_fields));
if ($entity->isNew() === false) {
$keys = (array)$options['repository']->primaryKey();
$keys = $this->_alias($alias, $entity->extract($keys));
if (array_filter($keys, 'strlen')) {
$conditions['NOT'] = $keys;
}
}

// handle null values
foreach ($conditions as $key => $value) {
if ($value === null) {
$conditions[$key . ' IS'] = $value;
unset($conditions[$key]);
}
}

return !$options['repository']->exists($conditions);
}

理论上,您也可以在重写的 IsUnique::_alias() 方法中执行此操作,无需重新实现原始规则类中的代码即可工作,但它并不是真正正确的位置。

https://github.com/cakephp/cakephp/blob/3.2.5/src/ORM/Rule/IsUnique.php

另见

关于php - CakePHP 3 Multiple isUnique 允许 NULL 重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36031664/

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