Kohana 3.1 ORM: пустое значение свойства модели, сохраненное как 0 (ноль) вместо NULL

#php #kohana #kohana-3 #kohana-orm

#php #kohana #kohana-3 #kohana-orm

Вопрос:

У меня есть две модели, Product и Product_Methodology. В моем представлении редактирования продукта у меня есть поле формы выбора, чтобы выбрать одну из многих методологий или ни одной (пустой первый вариант). В моей таблице продуктов у меня есть INT(10) methodology_id свойство, которое сохраняется с идентификатором методологии, выбранной в поле формы выбора. Все работало нормально до сегодняшнего дня, когда мне пришлось внести коррективы в систему, в которой с этого момента выбор методологии может быть необязательным. Итак, я изменил methodology_id поле таблицы products на разрешенное NULL значение и удалил not_empty правило проверки модели.

Проблема в том, что теперь, когда я сохраняю модель, выбирая пустой параметр, вместо ожидаемого NULL , я получаю 0 (нулевое) значение.

Есть какие-нибудь подсказки по этому поводу? Большое спасибо и дайте мне знать, если это не так понятно.

Комментарии:

1. Какую версию Kohana вы используете? Ko3.1 имеет специальные методы фильтрации для полей модели.

Ответ №1:

Какую форму ввода вы используете для выбора методологии? это <select> ? Если это так, значение выбранного параметра, вероятно, установлено в 0, если не выбрана методология, и отправляется с другими данными формы.

В таких случаях я создаю пользовательский фильтр с помощью filters() метода model, чтобы установить значение равным NULL (как это обрабатывает PHP), когда это empty() , что-то вроде этого:

 public function filters()
{
    return array(
        'methodology_id' => array(
            array('Filter::null', array(':value')),
        ),
    );
}
  

Где Filter — вспомогательный класс со статическими методами. Нравится…:

 class Kohana_Filter {

    public static function null($value)
    {
        return (empty($value) ? NULL : $value);
    }

}
  

Надеюсь, это поможет 🙂

Комментарии:

1. Спасибо за ваш ответ. Я выбрал этот вариант в качестве правильного ответа, потому что это самое элегантное решение, на мой взгляд. Я полагаю, что другие также верны.

Ответ №2:

Даже если отправленное поле формы пустое, это строка с любым пустым значением — не NULL. При сохранении в поле INT оно преобразуется в 0 (по крайней мере, в mysql). Чтобы сохранить нулевое значение, сделайте что-то вроде этого:

 $methodology_id = (empty($methodology_id) ? NULL : $methodology_id);
  

Ответ №3:

Пример использования замыкания для возврата нулевого значения, если значение поля является пустой строкой:

 public function filters()
{
    return array(
        // Return a NULL value if empty string.
        'field_name' => array(
            array(function($value){
                return ($value === '') ? NULL : $value;
            }, array(':value')),
        )
    );
}
  

Ответ №4:

Что вам следует сделать, так это установить ключ для значения None в вашем поле выбора равным 0.

Вы должны оставить правило not_empty для поля. Тогда у вас должно быть правило для поля, которое гарантирует, что значение является либо допустимым значением для product_methodology, либо нулевым.

Я расширяю ORM и использую следующие две функции:

 public function exists_or_zero(Validation $validation, $field, $model, $pk)
{
    // The exists() function is only called if the field has a non-zero value
    if ($validation[$field]) {
        $this->exists($validation, $field, $model, $pk);
    }
}

public function exists(Validation $validation, $field, $model, $pk)
{
    if ( ! ORM::factory($model, $pk)->loaded()) {
        $validation->error($field, 'exists', array($validation[$field]));
    }
}
  

Если бы вы использовали эти функции, ваши правила в классе product выглядели бы следующим образом:

 public function rules()
    return array(
        'product_methodology_id' => array(
            array('not_empty'),
            array(array($this, 'exists_or_zero'), array(':validation', ':field', 'product_methodology', ':value')),
        ),
    );
}