- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 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/
我在 vuelidate 中遇到导致无限循环的问题。这是我的项目的简要过程。我有一个 datatable,我使用 Firebase OnSnapShot 函数对表格进行分页。该表具有操作列,单击时将显
蛋糕 php 验证“isUnique”在编辑时出现错误 var $validate = array( 'name' => array( 'notempty' => array
我不明白 Mongoose 模式中 unique 和 required 等字段的用途。对于unique,您似乎必须编写自己的方法来查询 MongoDB 以查看该值是否已存在。我想对于“必需”Mongo
我的 BlockedTable.php 中有以下规则 public function buildRules(RulesChecker $rules) { $rules->add($rules-
我有一个带有主键的表,但我想约束另外两个列,以便保证两者的组合始终是唯一的。 (一个愚蠢的例子:在 BOOKS 表中,IBAN 列是主键,但 Title 和 Author 列的组合也应该始终是唯一的。
我是一名优秀的程序员,十分优秀!