find ('first') в пользовательском правиле проверки модели - PullRequest
0 голосов
/ 03 января 2012

Я хочу проверить, чтобы поле находилось в пределах диапазона чисел, зависящих от выбора другого поля.

например.

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

и в пределах ClassRange

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 голосов
/ 04 января 2012

Вы не должны назначать данные объекту запроса.Либо присвойте объект запроса другому массиву, например $data, и внесите в него свои обновления, либо найдите способ передать диапазон вашей функции проверки.

Кроме того, оператор поиска из вашего вопроса вернет массив,не объект.Так что ваш синтаксис там недействителен.Это, вероятно, причина вашей первоначальной проблемы.

Примерно так должно работать:

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;
}
0 голосов
/ 03 января 2012

Я понял!

Я извлек данные и установил пределы диапазона в виде дополнительных переменных в объекте запроса в контроллере непосредственно перед вызовом 'save'. Тогда сравнение можно сделать в модели .

//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;
}
...