2011-06-01 19 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')), 
     ) 
    ); 
} 
相關問題