Cakephp 4.x Conditional $rules->isUnique(['email']只适用于buildRules中的添加操作,而不适用于更新操作

am46iovg  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(167)

尝试通过buildRules实现条件验证逻辑。逻辑在add上有效,但在update操作上无效。我已经验证了该规则在update时返回true,在add时返回false。
我的表模型:
第一个
我试过了

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消息。但在添加时不显示任何消息,并停留在编辑窗体上。
任何建议或教育指针将不胜感激。抱歉,如果这是不正确的格式

更新日期:| 名称名称名称|型号|排序规则||- --|- --|- ---||电子邮件|瓦查尔(255)|utf8_通用_ci||发送电子邮件(_E)|varchar(1)|utf8_通用_ci|

目的是如果电子邮件已经存在并且send_email flag ==“Y”,则不允许更新或添加到数据库。只要send_email flag ==“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);
bxjv4tth

bxjv4tth1#

如果我没有理解错的话,那么在规则中简单地包含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组合的记录,则该规则将失败。您正在编辑的记录仍将被排除,但这不会是问题,因为它只影响可能已经存在的具有该数据的其他记录。

相关问题