Kohana 3.1 ORM:将空模型属性值保存为0(零)而不是NULL

时间:2011-06-01 18:53:29

标签: php kohana kohana-3 kohana-orm

我有两个型号,Product和Product_Methodology。在我的产品编辑视图中,我有一个选择表单字段,用于选择多种方法之一或无(第一个空选项)。在我的产品表中,我有一个INT(10) methodology_id属性,该属性使用从选择表单字段中选择的方法的ID进行保存。一切正常,直到今天我必须对系统进行调整,因为现在选择方法可以是可选的。因此,我更改了product表的methodology_id字段以允许NULL值,并删除了模型上的not_empty验证规则。

问题是,现在当我保存模型选择空选项而不是预期的NULL时,我得到0(零)值。

有什么线索吗? 非常感谢,如果不是那么清楚,请告诉我。

4 个答案:

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