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')),
),
);
}