一 问题php
最近在使用 Yii2.0,遇到一个 bug:在 /models/OrderDetail.php add() 方法中调用 load() 方法加载数据,却加载不了。浏览器
public function add($data) { if ($this->load($data) && $this->save()) { return true; } return false; }
二 排错this
2.1 将 add() 方法修改为以下(添加 $this->getErrors()):spa
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() 方法加载不了数据。code
2.2 查看 load() 方法源码:orm
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 的产生。blog
三 解决方法get
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 传过来就能够了。it