• Yii2.0 下的 load() 方法的使用


    一 问题

    最近在使用 Yii2.0,遇到一个 bug:在 /models/OrderDetail.php add() 方法中调用 load() 方法加载数据,却加载不了。

    public function add($data)
    {
        if ($this->load($data) && $this->save()) {
            return true;
        }
        return false;
    }

    二 排错

    2.1 将 add() 方法修改成如下(添加 $this->getErrors()):

    public function add($data)
    {
        if (!$this->load($data) ) {
            var_dump($this->getErrors()); echo 'load'; exit;
        }
        if (!$this->save() ) {
            var_dump($this->getErrors()); echo 'save'; exit;
        }
        return false;
    }

    浏览器显示 "array(0){}load"。说明确实是 load() 方法加载不了数据。

    2.2 查看 load() 方法源码:

    public function load($data, $formName = null)
    {
        $scope = $formName === null ? $this->formName() : $formName;
        if ($scope === '' && !empty($data)) {
            $this->setAttributes($data);
            return true;
        } elseif (isset($data[$scope])) {
            $this->setAttributes($data[$scope]);
            return true;
        } else {
            return false;
        }
    }

    主要看 formName() 方法。该方法通过类反射返回与模型名对应的表单名。在 load() 方法中,在通过 $this->formName() 获得 $scope 的值后,就会判断变量 $data[$scope] 是否存在,若是就会返回真,否则返回假。由于变量 $data[$scope] 确实不存在,所以导致了 bug 的产生。

    三 解决方法

    3.1 可以将 add() 方法修改成如下:

    public function add($data)
    {
        // OrderDetail 是模型名
        if ($this->load(['OrderDetail' => $data]) && $this->save()) {
          return true;
        }
        return false;
    }

    3.2 不修改 add() 方法,而是在对应的控制器里修改传给模型的 $data,将其修改为 $data['OrderDetail'] = $data; 再将 $data 传过来就可以了。

  • 相关阅读:
    什么叫TLD、gTLD、nTLD、ccTLD、iTLD 以及几者之间的关系
    socket
    windows下codeblocks报错undefined reference to `WSAStartup@8'|
    Codeforces 467C George and Job | DP
    51Nod 1049最大子段和 | 模板
    51Nod 最大子矩阵和 | DP
    AtomicInteger
    sun.misc.unsafe
    CAS
    java中的四种引用
  • 原文地址:https://www.cnblogs.com/afee666/p/6882311.html
Copyright © 2020-2023  润新知