【问题标题】:Cakephp 4.x Conditional $rules->isUnique(['email'] only works on add, not udate operations in buildRulesCakephp 4.x Conditional $rules->isUn​​ique(['email'] 仅适用于 add 而不是 buildRules 中的 udate 操作
【发布时间】: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


【解决方案1】:

如果我对您的理解正确,那么听起来就像在规则中简单地包含 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 组合的现有记录,则规则应该失败。您正在编辑的记录仍将是豁免的,但这不是问题,因为它只关心可能已经存在具有该数据的其他记录。

【讨论】:

  • 那行得通。我的问题是程序需要接受我的多个重复电子邮件地址,其中 send_email = 'N'。我拼凑了另一种方法,我将作为可能的答案发布。我正在学习 Cakephp,非常感谢您的意见!
  • @smoeckel 为什么在这个工作时还需要其他东西?当$entity->send_email 不是Y 时,该规则返回true,因此应涵盖您允许重复的情况?
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2015-11-13
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2019-03-24
相关资源
最近更新 更多