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