Cakephp 4.x 条件 $rules->isUn​​ique(['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' ...

因此,如果已经存在包含 emailsend_email 组合的记录,则规则应该失败。您正在编辑的记录仍将被豁免,但这不是问题,因为它只关系到其他包含该数据的记录可能已经存在。