【发布时间】:2021-03-21 09:53:40
【问题描述】:
尝试通过 buildRules 实现条件验证逻辑。逻辑适用于添加,但不适用于更新操作。我已验证该规则在更新时返回 true,在添加时返回 false。
我的表模型:
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Rule\IsUnique;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\Event\EventInterface;
use ArrayObject;
use Cake\Error\Debugger;
use Cake\Log\Log;
public function buildRules(RulesChecker $rules): RulesChecker {
$rules->add(function ($entity, $options) use($rules) {
if ($entity->send_email == 'Y') {
$rule = $rules->isUnique(['email'], 'The email should be unique for MailChimp'); // Works on add only
return $rule($entity, $options); // Works on add only
}
return true;
}, 'email');
return $rules;
}
我试过了
public function buildRules(RulesChecker $rules): RulesChecker {
$rules->add(function ($entity, $options) use($rules) {
if ($entity->send_email == 'Y') {
$rules->add($rules->isUnique(
['email'], 'Error Message'
));
return $rules;
}
return true;
}, 'email');
return $rules;
}
在编辑时显示来自控制器的 Flash 消息。 但在添加时不显示任何消息并停留在编辑表单上。
任何建议或教育指针将不胜感激。 抱歉,如果格式不正确
更新: |姓名 |类型 |整理 | | ----------------| ------------------ | -------------------- | |电子邮件 | varchar(255) | utf8_general_ci | |发送电子邮件 | varchar(1) | utf8_general_ci |
如果电子邮件已经存在并且 send_email flag == "Y",则目的是不让更新或添加到数据库 只要 send_email 标志 == "N",电子邮件多次存在就有效 返回 true 正在从唯一检查中生成
$rule = $rules->isUnique(['email'], 'The email should be unique for MailChimp'); // Works on add only
Debugger::dump($rule($entity, $options));
return $rule($entity, $options);
【问题讨论】:
-
数据库中有哪些数据?你想用什么值更新哪一行?正在更新的行免于唯一检查。您是否还检查了从哪里返回
true,即它是唯一的检查,还是您硬编码的return true? -
我只能假设调试语句应该告诉我这是您捕获两种情况的地方!?架构并不真正相关,而是实际数据!在不知道现有数据、您尝试编辑的数据以及新数据的样子的情况下,无法判断您获得的结果是否合法。
-
谢谢ndm。表中的现有数据将是一封重复的电子邮件,其中 send_email 列设置为“N”我想要实现的只是电子邮件和 send_email 设置为“Y”的一种组合。只要每条记录的 send_email 设置为“N”,就可以有多个重复的电子邮件。我是新来的。是不是以错误的方式处理这个问题?
-
编辑超时,因为我试图澄清。您声明正在编辑的行免于唯一检查。有什么办法吗?在编辑时,我正在使用重复的电子邮件更改现有记录,并且 send_email 设置为“N”。想要我不希望用户能够做的是保留电子邮件地址(重复)并将 send_email 标志更改为“Y”,这将导致重复组合。
标签: cakephp cakephp-4.x