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

Posted afee666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 传过来就可以了。

 

以上是关于Yii2.0 下的 load() 方法的使用的主要内容,如果未能解决你的问题,请参考以下文章

Yii2.0 手动添加扩展 redis为例

yii2.0配置以pathinfo的形式访问

21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用

Yii2.0配置pathinfo模式

yii2.0中添加新的模块

yii2.0 手动配置redis