zoukankan      html  css  js  c++  java
  • 解决phalcon model在插入或更新时会自动验证非空字段

    在使用phalcon的insert和update功能时,因为数据库所有的字段设置的都是NOT NULL,而phalcon的model在插入或更新之前会自动判断字段是否需要必填,因此导致有空字段时无法存入。

    开始遇到这问题时,想到两种解决方法:

    一、改数据库字段,把NOT NULL改为可以为空。

      但该数据库还得去找DBA,而且为了性能,DBA要求一般没有特殊情况,字段必须是NOT NULL,所以该方案否决。

    二、给可以为空的字段设置默认值。

      想过各种默认值,觉得空格最符合,但是赋值空格后,数据库里存的也会是空格,像一些empty和==''等判断会失效,很可能会影响一些业务逻辑,想想,还是放弃该方案。

    最后还是上网各种搜,phalcon的资料太少,百度根本搜不出来,最后转战google,功夫不负有心人,终于给我找到些蛛丝马迹,最后再根据蛛丝马迹找出来真正的解决方案。同样有两种,如下:

    一、给可以为空的字段单独设置规则

    public function skipValidation($skipers=[])
        {
            foreach ($skipers as $skiper) {
                if (empty($this->$skiper)) {
                    $this->$skiper = new \Phalcon\Db\RawValue('""');
                }
            }   
        }

     使用的时候:

    public function beforeValidation()
    {
         $this->skipValidation(['tag','source_url']);
    }

    这种方法可以完美解决问题,比较麻烦的是,需要设置每个可以为空的字段。

    二、关闭phalcon对字段是否为空的判断

    public function initialize(){
    
        $this->setup(
            array('notNullValidations'=>false)
        );
    
      }

    该方法直接把底层判断字段是否为空的逻辑关闭了,可以一劳永逸的解决这个问题,缺点就是,自己前后台得做好必填字段的判断。

  • 相关阅读:
    sublime配置攻略
    Objective-C代码块语法(block)使用
    [C/C++]_[VS2010来源与UTF8中国字符串转码ANSI问题]
    Android资源管理框架(Asset Manager)简介和学习计划
    ExtJs自学教程(1):从一切API开始
    ORACLE触发特定的解释
    同TextView在不同的显示内容
    :gAudit
    IIS日志分析 MapReduce
    图片存储心得
  • 原文地址:https://www.cnblogs.com/sbman/p/6233676.html
Copyright © 2011-2022 走看看