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

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

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

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

4 ответа

Решение

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

В таких случаях я делаю пользовательский фильтр на основе модели filters() метод, чтобы установить значение в 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);
    }

}

Надеюсь это поможет:)

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

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

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

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

Что вы должны сделать, это установить ключ для значения 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]));
    }
}

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

public function rules()
    return array(
        'product_methodology_id' => array(
            array('not_empty'),
            array(array($this, 'exists_or_zero'), array(':validation', ':field', 'product_methodology', ':value')),
        ),
    );
}
Другие вопросы по тегам