我有两个型号,Product和Product_Methodology。在我的产品编辑视图中,我有一个选择表单字段,用于选择多种方法之一或无(第一个空选项)。在我的产品表中,我有一个INT(10)
methodology_id
属性,该属性使用从选择表单字段中选择的方法的ID进行保存。一切正常,直到今天我必须对系统进行调整,因为现在选择方法可以是可选的。因此,我更改了product表的methodology_id
字段以允许NULL
值,并删除了模型上的not_empty
验证规则。
问题是,现在当我保存模型选择空选项而不是预期的NULL
时,我得到0
(零)值。
有什么线索吗? 非常感谢,如果不是那么清楚,请告诉我。
答案 0 :(得分:6)
您使用什么形式输入来选择方法?是<select>
吗?
如果是这样,当没有选择方法时,选择选项的值可能设置为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 :(得分:1)
即使提交的表单字段为空,它也是一个包含任何空值的字符串 - 而不是NULL。当保存到INT字段时(至少在mysql中),它会被转换为0。要保留null值,请执行以下操作:
$methodology_id = (empty($methodology_id) ? NULL : $methodology_id);
答案 2 :(得分:1)
如果字段值为空字符串,则使用闭包返回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')),
)
);
}
答案 3 :(得分:0)
您应该将选择框中无值的键设置为 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')),
),
);
}