3

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

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

对此有任何线索吗?非常感谢,如果不是很清楚,请告诉我。

4

4 回答 4

6

您使用什么表单输入来选择方法?是<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);
    }

}

希望这可以帮助 :)

于 2011-06-01T20:58:19.670 回答
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')),
        )
    );
}
于 2011-11-18T09:59:01.367 回答
1

即使提交的表单字段是空白的,它也是一个带有任何空值的字符串 - 不是 NULL。当保存到 INT 字段(至少在 mysql 中)时,这将被强制转换为 0。要保留空值,请执行以下操作:

$methodology_id = (empty($methodology_id) ? NULL : $methodology_id);
于 2011-06-02T08:18:45.083 回答
0

您应该做的是将选择框中的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')),
        ),
    );
}
于 2011-06-02T01:25:06.957 回答