2011-06-01 20 views
3

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

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

任何线索? 非常感谢,让我知道如果它不是很清楚。

+0

你用什么Kohana的版本? Ko3.1为模型领域提供了特殊的过滤方法。 – biakaveron 2011-06-02 05:29:48

+0

我在版本3.1。 – 2011-06-02 15:18:49

回答

6

您使用何种形式输入来选择方法?是<select>? 如果是这样,当选择方法时,选择选项的值可能设置为0,并与其他表单数据一起发送。

在这种情况下,我做一个自定义过滤器withing模型filters()方法,将值设置为NULL(如PHP会将其)时,它的empty(),这样的事情:

public function filters() 
{ 
    return array(
     'methodology_id' => array(
      array('Filter::null', array(':value')), 
     ), 
    ); 
} 

如果过滤器是助手类静态方法。像...:

class Kohana_Filter { 

    public static function null($value) 
    { 
     return (empty($value) ? NULL : $value); 
    } 

} 

希望这有助于:)

+0

感谢您的回答。我选择这个作为正确的答案,因为它是我头脑中最优雅的解决方案。我相信别人也是对的。 – 2011-06-02 15:15:17

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

即使提交的表单域为空,它也是一个空值的字符串 - 不是NULL。当保存到INT字段时(至少在mysql中),它会被转换为0。为了保持一个空值做这样的事情:

$methodology_id = (empty($methodology_id) ? NULL : $methodology_id); 
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')), 
     ) 
    ); 
} 
相关问题