【问题标题】:Kohana 3.1 ORM: Empty model property value saved as 0 (zero) instead of NULLKohana 3.1 ORM:空模型属性值保存为 0(零)而不是 NULL
【发布时间】:2011-06-01 18:53:29
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的 Kohana 版本是什么? Ko3.1 对模型字段有特殊的过滤方法。

标签: php kohana kohana-3 kohana-orm


【解决方案1】:

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

在这种情况下,我使用模型的 filters() 方法制作了一个自定义过滤器,当它是 empty() 时,将值设置为 NULL(PHP 处理它),如下所示:

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);
    }

}

希望这会有所帮助:)

【讨论】:

  • 感谢您的回答。我选择了这个作为正确答案,因为它是我心目中最优雅的解决方案。我相信其他人也是正确的。
【解决方案2】:

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

$methodology_id = (empty($methodology_id) ? NULL : $methodology_id);

【讨论】:

    【解决方案3】:

    如果字段值为空字符串,则使用闭包返回 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')),
            )
        );
    }
    

    【讨论】:

      【解决方案4】:

      您应该将选择框中的 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]));
          }
      }
      

      如果您要使用这些函数,您在 product 类中的规则如下所示:

      public function rules()
          return array(
              'product_methodology_id' => array(
                  array('not_empty'),
                  array(array($this, 'exists_or_zero'), array(':validation', ':field', 'product_methodology', ':value')),
              ),
          );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多