Kohana 3.1 ORM: пустое значение свойства модели сохраняется как 0 (ноль) вместо NULL - PullRequest
3 голосов
/ 01 июня 2011

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

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

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

Ответы [ 4 ]

6 голосов
/ 02 июня 2011

Какую форму ввода вы используете для выбора методологии?это <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);
    }

}

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

1 голос
/ 18 ноября 2011

Пример использования замыкания для возврата значения 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')),
        )
    );
}
1 голос
/ 02 июня 2011

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

$methodology_id = (empty($methodology_id) ? NULL : $methodology_id);
0 голосов
/ 02 июня 2011

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