牛骨文教育服务平台(让学习变的简单)
博文笔记

关于ThinkPHP框架addAll()方法的设计问题填坑

创建时间:2017-02-19 投稿人: 浏览次数:138
今天在讲解ThinkPHP框架的时候在使用ThinkPHP基础模型类提供的addAll()方法进行多条数据写入时报错了,而且使用模型的
getError()都获取不到错误提示!没错,获取不到错误!所以我认为这是ThinkPHP框架设计中存在的Bug。在学生都去吃饭时我
自己翻看了框架底层对于addAll()的实现。

我的课堂代码是这样写的:

if (M("SubOrder")->addAll($allGoods) === false) {
    $this->rollback();
    throw new Exception("提交订单失败,请稍后再试!", 0);
}

因为为了获取数据方便我的$allGoods是使用goods_id来索引的,错误就出在这儿但是让我恨不能理解,让我们一一道来。

我的$allGoods的结构是这样的

array(2) {
  [5] => array(4) {
    ["goods_id"] => string(1) "5"
    ["price"] => string(6) "123.00"
    ["goods_num"] => string(1) "2"
    ["order_id"] => string(2) "16"
  }
  [15] => array(4) {
    ["goods_id"] => string(2) "15"
    ["price"] => string(4) "0.10"
    ["goods_num"] => string(1) "2"
    ["order_id"] => string(2) "16"
  }
}

查看其它都没有问题的情况下唯一可能出错的就是数据的索引方式了,难道TP只能使用从0开始索引的二维数组?这让我很不能理解,作为一个框架应该考虑到通用性,所以翻看了TP中mysql驱动里关于insertAll()的实现,因为model中的addAll()就是调用驱动里的insertAll()实现的:

$result = $this->db->insertAll($dataList,$options,$replace);

所以就是这样了!

public function insertAll($dataSet,$options=array(),$replace=false) {
    $values  =  array();
    $this->model  =   $options["model"];
    if(!is_array($dataSet[0])) return false;   //问题就出在这儿

问题就出在对于$dataSet[0]的判断中!顿时心中千军万马奔腾而过,作为框架如果非要这样操作为什么不先对$dataSet重写索引后来处理呢?好吧,我要改,我要改框架!-_-

框架修改方式。打开Library/Think/Db/Driver/Mysql.class.php找到insertAll方法修改如下

public function insertAll($dataSet,$options=array(),$replace=false) {
    $values  =  array();
    $this->model  =   $options["model"];
    $firstRow = array_shift($dataSet);    //取出传入数组的第一条数据
    if(!is_array($firstRow)) return false;   //根据框架的思想进行简单的数组判断
    $dataSet[] = $firstRow;     //重新赋值到待写入数组的元素中

至此,问题解决。最后,ThinkPHP官方已经致力于开发ThinkPHP5了,ThinkPHP3.2.3的维护生命周期已经结束了,所以还在使用ThinkPHP3.2.3作为开发框架的公司只能靠自己了。


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。