0

我在一个表中有 4 个属性;num_a, num_b, num_c, num_d, 这些单独可以在 0 到 2 的范围内,例如我$validate在模型中的属性中:

'num_a' => [
  'numeric' => [
    'rule' => 'numeric',
    'message' => 'Please provide the number of a.',
  ],
 'isInRange' => [
   'rule' => ['range', -1, 3],
   'message' => 'Must be between 0 and 2.'
 ],

我面临的问题是这些总和必须大于0。如果是这种情况,我希望它返回一些验证错误,例如:

'num_all' => [
  'rule' => 'returnFalse',
  'message' => 'There were no a, b, c or d selected.',
],

我的returnFalse模型中有简单的功能

public function returnFalse() {
  return false;
}

始终添加此规则。

beforeValidate我正在检查num_a通过的总和num_d并删除验证规则(如果$sum > 0是这样的话):

public function beforeValidate($options=array())
{
  $sum = 0;
  $sum += (isset($this->data['MyModel']['num_a'])) ? $this->data['MyModel']['num_a'] : 0;
  $sum += (isset($this->data['MyModel']['num_b'])) ? $this->data['MyModel']['num_b'] : 0;
  $sum += (isset($this->data['MyModel']['num_c'])) ? $this->data['MyModel']['num_c'] : 0;
  $sum += (isset($this->data['MyModel']['num_d'])) ? $this->data['MyModel']['num_d'] : 0;

  if ($sum > 0) {
    $this->validator()->remove('num_all');
  }
}

但由于某种原因,我无法让它返回验证错误num_all

我什至尝试添加一个虚拟字段,因此验证错误可能与以下内容有关:

public $virtualFields = [
  'num_all' => 'SELECT 0 FROM dual',
];

但这也不起作用。我正在使用 CakePHP v2.8。

4

1 回答 1

0

好的,所以我放弃了num_allin$validate属性和虚拟字段等以及“总是失败”规则,而是破解了以下模型validationErrors数组的条目beforeValidate

public function beforeValidate($options=array())
{
  $sum = 0;
  $sum += (isset($this->data['MyModel']['num_a'])) ? $this->data['MyModel']['num_a'] : 0;
  $sum += (isset($this->data['MyModel']['num_b'])) ? $this->data['MyModel']['num_b'] : 0;
  $sum += (isset($this->data['MyModel']['num_c'])) ? $this->data['MyModel']['num_c'] : 0;
  $sum += (isset($this->data['MyModel']['num_d'])) ? $this->data['MyModel']['num_d'] : 0;

  if ($sum > 0) {
    $this->validationErrors['num_all'][] = 'There were no a, b, c or d selected.'
  }
}

现在它工作正常。希望这可以帮助。

于 2017-06-30T10:34:00.527 回答