美文网首页PHP学习程序员
小心使用ThinkPHP中的addAll方法

小心使用ThinkPHP中的addAll方法

作者: 栾呱呱 | 来源:发表于2016-04-21 20:05 被阅读3816次

    作者在项目里写一个简单的创建问题接口时,一不小心就踩到了ThinkPHP的两个坑。将它称之为坑,实则是对文档的不熟悉。接口代码如下:

        public function createProblems()
        {
            $problems = I('json.');
            if (empty($problems)) {
                $this->error($problems, 'json格式不符合规范');
            }
            foreach ($problems as $problem) {
                $data = D('Problem')->create($problem, self::OP_INSERT);
                if (!$data) {
                    $this->error($problem, D('Problem')->getError());
                }
                $temp[] = $data;
            }
            $ret = D('Problem', 'Service')->addProblems($temp);
            if ($ret === false) {
                $this->error(null, '导入失败');
            }
            $this->success(null);
        }
    

    接口完成的功能是批量创建问题,参数为json数组,addProblem()方法中就是一个addAll操作。

    第一个坑-自动填充

    使用自动填充可能会覆盖表单提交项目。其目的是为了防止表单非法提交字段。使用Model类的create方法创建数据对象的时候会自动进行表单数据处理。

    官方文档明确说了自动填充会覆盖表单,所以即使你post过来的参数中给出了具体数值,使用create方法之后也可能会被覆盖。千万注意!!!

    第二个坑-addAll方法

    addAll方法中不能出现null值,否则其他数据会自动向前移动,导致添加失败。举例:

        [
            {
                "appId": 1,
                "serviceId": 2,
                "createUser":null,
                "status": 1,
                "priority": 2
            }
        ]
    

    其中,createUser字段为null,插入时的sql语句会变成insert into va_problem (appId, serviceId, createUser, status, priority)values (1, 2, 1, 2)。null值没了,导致插入失败,这应该是ThinkPHP3.2.3的一个bug。这篇博客有相关的讨论。

    引入坑的过程

    problemModel里面有对createUser做自动填充。

    通过api创建问题时,首先自动填充会覆盖,所以表单中的createUser值失效,这是第一个坑。然后,由于自动填充createUser调用的是get_username()函数,通过api调用时,session(username)取不到值,所以create之后字段变成"createUser":null,引入了第二个坑。

    相关文章

      网友评论

        本文标题:小心使用ThinkPHP中的addAll方法

        本文链接:https://www.haomeiwen.com/subject/uiczlttx.html