同时新增多条记录:saveAll方法
2. 源码:/thinkphp/library/think/Model.php/**
* 保存多个数据到当前数据对象
* @access public
* @param array $dataSet 数据
* @param boolean $replace 是否自动识别更新和写入
* @return array|false
*/public function saveAll($dataSet, $replace = true){if ($this->validate) {// 数据批量验证$validate = $this->validate;foreach ($dataSet as $data) {if (!$this->validate($validate)->validateData($data)) {return false;
}
}
}$result = [];$db = $this->db();$db->startTrans();try {$pk = $this->getPk();if (is_string($pk) && $replace) {$auto = true;
}foreach ($dataSet as $key => $data) {if (!empty($auto) && isset($data[$pk])) {$result[$key] = self::update($data);
} else {$result[$key] = self::create($data);
}
}$db->commit();return $result;
} catch (\Exception $e) {$db->rollback();throw $e;
}
}可以看出这个方法有一个必填参数:二维数组
3. 参数与返回值
参数
参数虽有2个,但我们只需要第一个即可
序号参数说明1$dataSet / 二维数组键名应与表中字段名一致,记录与数组元素一一对应
返回值:由数据对象构成的对象数组。
注意:不是受影响的记录数量
4. 实例演示
任务:给tp5_staff表中新增3条员工信息。创建模型: /application/index/model/Staff.php
namespace app\index\model;//导入模型类use think\model;class Staff extends model {//自定义模型类代码}创建控制器:/application/index/controller/Index.php
//创建数据 $data[] = ['name'=>'阿芳','sex'=>0,'age'=>19,'salary'=>3000,'hiredate'=>date('Y-m_d',time())];
$data[] = ['name'=>'阿勇','sex'=>1,'age'=>20,'salary'=>4500,'hiredate'=>date('Y-m_d',time())];
$data[] = ['name'=>'阿华','sex'=>1,'age'=>39,'salary'=>6800,'hiredate'=>date('Y-m_d',time())];
//创建模型对象 $model = new Staff(); //执行新增操作,返回对象数组,数组元素数量与新增数据相同 //每个对象数据元素,都是一个数据对象$data $result = $model
-> allowField(true)
-> saveAll($data); //3.验证是否新增成功 echo $result ? '新增成功!' : '新增失败!'; //4.查看新增的数据集 echo '
新增的数据如下:
'; //5.对象数组,需要用循环输出 foreach ($result as $value) { //获取对象数组中,每一个数据对象的原始数据 $data = $value -> getData();//内循环中遍历输出每个数据对象中的原始数据 foreach ($data as $key => $value) { echo $key.'=>'.$value.' | ';
} echo '
';
}
}
}运行结果:新增成功!
新增的数据如下:
name=>阿芳 | sex=>0 | age=>19 | salary=>3000 | hiredate=>2016-11_25 | id=>1141 |
name=>阿勇 | sex=>1 | age=>20 | salary=>4500 | hiredate=>2016-11_25 | id=>1142 |
name=>阿华 | sex=>1 | age=>39 | salary=>6800 | hiredate=>2016-11_25 | id=>1143 |生成的SQL语句:INSERT INTO `tp5_staff` (`name` , `sex` , `age` , `salary` , `hiredate`) VALUES ('阿芳' , 0 , 19 , 3000 , '2016-11_25')INSERT INTO `tp5_staff` (`name` , `sex` , `age` , `salary` , `hiredate`) VALUES ('阿勇' , 1 , 20 , 4500 , '2016-11_25')INSERT INTO `tp5_staff` (`name` , `sex` , `age` , `salary` , `hiredate`) VALUES ('阿华' , 1 , 39 , 6800 , '2016-11_25')我们现在查看一下数据表:SQLPRP for MySQL
5. 总结:尽管在实际开发中,saveAll方法使用频率远不如save方法,但有时还是非常有用的,希望同学们多多练习并掌握它。