Cakephp 4.x 条件 $rules->isUnique(['email'] 仅适用于添加,不适用于 buildRules 中的更新操作
Cakephp 4.x Conditional $rules->isUnique(['email'] only works on add, not udate operations in buildRules
正在尝试通过 buildRules 实施条件验证逻辑。逻辑适用于添加,但不适用于更新操作。我已验证规则 return 在更新时为真,在添加时为假。
我的Table模特:
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;
}
在编辑时显示来自控制器的闪烁消息。
但是在添加时不显示任何消息并停留在编辑表单上。
任何建议或教育指导将不胜感激。
抱歉,如果格式不正确
更新:
|名称 |类型 |整理|
| --------------| ------------------ | ------------------ |
|电邮 |变种(255) | utf8_general_ci |
| send_email |变种(1) | utf8_general_ci |
目的是如果电子邮件已经存在并且 send_email flag == "Y",则不允许更新或添加到数据库
只要send_email flag == "N",邮件多次存在都是有效的
return 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);
如果我对您的理解正确,那么听起来只需在规则中包含 send_email
字段就可以满足您的需求,即:
if ($entity->send_email === 'Y') {
$rule = $rules->isUnique(
['email', 'send_email'],
'The email should be unique for MailChimp'
);
return $rule($entity, $options);
}
return true;
这样查找条件会是这样的:
WHERE email = 'unchanged@email' AND send_email = 'Y' ...
因此,如果已经存在包含 email
和 send_email
组合的记录,则规则应该失败。您正在编辑的记录仍将被豁免,但这不是问题,因为它只关系到其他包含该数据的记录可能已经存在。
正在尝试通过 buildRules 实施条件验证逻辑。逻辑适用于添加,但不适用于更新操作。我已验证规则 return 在更新时为真,在添加时为假。
我的Table模特:
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;
}
在编辑时显示来自控制器的闪烁消息。 但是在添加时不显示任何消息并停留在编辑表单上。
任何建议或教育指导将不胜感激。 抱歉,如果格式不正确
更新: |名称 |类型 |整理| | --------------| ------------------ | ------------------ | |电邮 |变种(255) | utf8_general_ci | | send_email |变种(1) | utf8_general_ci |
目的是如果电子邮件已经存在并且 send_email flag == "Y",则不允许更新或添加到数据库 只要send_email flag == "N",邮件多次存在都是有效的 return 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);
如果我对您的理解正确,那么听起来只需在规则中包含 send_email
字段就可以满足您的需求,即:
if ($entity->send_email === 'Y') {
$rule = $rules->isUnique(
['email', 'send_email'],
'The email should be unique for MailChimp'
);
return $rule($entity, $options);
}
return true;
这样查找条件会是这样的:
WHERE email = 'unchanged@email' AND send_email = 'Y' ...
因此,如果已经存在包含 email
和 send_email
组合的记录,则规则应该失败。您正在编辑的记录仍将被豁免,但这不是问题,因为它只关系到其他包含该数据的记录可能已经存在。