在模型自定义验证规则中查找('第一个')

时间:2012-01-03 15:18:20

标签: validation cakephp-2.0

我想验证一个字段是否在一个数字范围内,这取决于另一个字段选择。

例如

    'rating' => array(
    'within class range' => array(
        'rule' => 'withinClassRange',
        'message' => 'number not in range'
    )
),

和withinClassRange

public function withinClassRange($data) {

    // get class range
    $classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->data['Edition']['aclass_id'])));
    if($data['rating'] < $classRange->minRange) {
        return false;
    }
    if($data['rating'] > $classRange->maxRange) {
        return false;
    }
    return true;
}

但这个发现只能在控制器内完成。我该如何实现呢?

2 个答案:

答案 0 :(得分:0)

我明白了!

我所做的是检索数据并在“保存”调用之前将范围限制设置为控制器中的请求对象中的额外变量。然后可以在模型中进行比较。

//controller
$classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->request->data['Edition']['aclass_id'])));
$this->request->data['Edition']['minRange'] = $classRange['Aclass']['minRange'];
$this->request->data['Edition']['maxRange'] = $classRange['Aclass']['maxRange'];

//model
public function withinClassRange($data) {
  if($data['rating'] < $this->data['Edition']['minRange']) {
    return false;
  }
  if($data['rating'] > $this->data['Edition']['maxRange']) {
    return false;
  }
  return true;
}

答案 1 :(得分:0)

您不应该真正将数据分配给请求对象。将请求对象分配给另一个数组,例如$data,然后在那里进行更新,或者找到将范围传递给验证函数的方法。

此外,您问题中的find语句将返回一个数组,而不是一个对象。所以你的语法在那里无效。这可能是你原来问题的原因。

这样的事情应该有效:

public function withinClassRange($data) {

    // get class range
    $classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->data['Edition']['aclass_id'])));
    if($data['rating'] > $classRange['Aclass']['minRange'] && $data['rating'] < $classRange['Aclass']['maxRange']) {
        return true;
    }

    return false;
}