thinkphp5 模型批量增加数据小记

楼主最近在学习thinkphp5,真的没应广大使用教程所说:你最好就是没学过thinkphp3.2。要不然苦恼重重。

因为想将一些功能实现一次,故自己写了一个文件上传类。

可以实现单文件,多文件上传(文件或者图片)。

鉴于thinkphp 5的写法,看文档是新增用$model->save()方法。如果是批量增加的话,就有两种做法:

做法一:$model->saveAll($data);

做法二:$model->isUpdate(false)->save();//循环

官方是这样给出的。

原型:

 1 //单条数据
 2 //method 1
 3 $user           = new User;
 4 $user->name     = ‘thinkphp‘;
 5 $user->email    = ‘[email protected]‘;
 6 $user->save();
 7
 8 //method 2
 9 // 使用model助手函数实例化User模型
10 $user = model(‘User‘);
11 // 模型对象赋值
12 $user->data([
13     ‘name‘  =>  ‘thinkphp‘,
14     ‘email‘ =>  ‘[email protected]‘
15 ]);
16 $user->save();
17
18 //多条数据新增
19 //method 1
20 $user = new User;
21 $list = [
22     [‘name‘=>‘thinkphp‘,‘email‘=>‘[email protected]‘],
23     [‘name‘=>‘onethink‘,‘email‘=>‘[email protected]‘]
24 ];
25 $user->saveAll($list);
26
27 //method 2
28 $user = new User;
29 $list = [
30     [‘id‘=>1, ‘name‘=>‘thinkphp‘, ‘email‘=>‘[email protected]‘],
31     [‘id‘=>2, ‘name‘=>‘onethink‘, ‘email‘=>‘[email protected]‘],
32 ];
33 $user->saveAll($list, false);

不知到各位是怎么想的,反正我按照了之前的做法,直接使用 $model->save($data);新增一条数据,没想到真的可以成功。

然后惯性的思想,循环的时候就用了$model->isUpdate(fasle)->save($data);

然后?没然后了,悲催了:

1 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘57‘ for key ‘PRIMARY‘

显示明显。存在了相应的数据阻止了数据的新增。如果从百度上上面去单从这个错误区找解决方法的话,估计就是教你把主键设置为自增字段。

但是,明显楼主在设计数据表的时候,主键已经为子增字段,何况之前还能新增数据!

真的是神奇。然后我就去数据库查看了一下数据的记录,还真的是发现有一条记录里面,但是这条记录除了主键,其余的只有默认信息。

猜测,是在执行过程中,执行了两次新增,不知到为什么第二次新增的时候,主键的值不知到为何与第一次的新增值关联了起来。

楼主修行不足,没法深究。然后看了一下文档下面的评论才找到解决方法。

错误执行时的代码:

 1 //新增
 2     public function test_add(){
 3         $data = [
 4             ‘name‘   => ‘tm‘,
 5             //‘score‘  => 92
 6             ‘iphone‘ => ‘13631789377‘,
 7             ‘email‘  => ‘[email protected]‘,
 8             ‘status‘ => 1
 9         ];
10
11         $student = model(‘Student‘);
12         // 一条记录
13         $res = $student->save($data);
14         dump($student->id);
15         //多条记录
16         for($i = 0; $i < 4; $i++){
17             $res = $student->isUpdate(false)->save($data);
18             dump($student->id);
19         }
20     }

这个仅仅是为了测试新建的一个数据表。

一下是成功插入数据的代码:

 1  //新增
 2     public function test_add(){
 3         $data = [
 4             ‘name‘   => ‘tm‘,
 5             //‘score‘  => 92
 6             ‘iphone‘ => ‘13631789377‘,
 7             ‘email‘  => ‘[email protected]‘,
 8             ‘status‘ => 1
 9         ];
10
11         $student = model(‘Student‘);
12         //单条记录
13         $res = $student->save($data);
14         dump($student->id);
15
16         // 多条记录
17         for($i = 0; $i < 4; $i++){
18             $res = $student->data($data, true)->isUpdate(false)->save();
19             dump($student->id);
20         }
21     }

由代码看出,把数据放在前面用data函数传递,至于第二个参数,我看到讨论区有人传进去就错了,可是作者说请以最新代码为准~~~为那老哥默哀几分钟。

但是本人设不设置第二个参数都试了一下,没发现有什么不一样。如果日后代码修改了。大家请以我现在的版本为准~~~汗!!

总结一下学习tp5的心得:

看了整整一个星期,断断续续,反反复复。只能说作者还是需要完善一下文档吧。毕竟像楼主这样的穷学生还是很多的--没钱去看收费的文档。

最终要的一点就是--请及时更新一下自己的代码。不要看文档说什么就是什么。一定要动手,因为,你分分钟不知到代码有没有更新了。(现在我直接git他们的项目回来的)

更重要的一点就是:尝试各种办法没解决问题的时候,去看一下文档下面的评论,或许答案就在哪里。真的。我这个多条记录的data函数就是这样找来的!

时间: 2024-08-30 03:59:09

thinkphp5 模型批量增加数据小记的相关文章

oracle批量增加数据

记工作需要用到的一个批量插入数据的脚本. declare code_ number(10) := 100000; num_ number(10) := 2000000; error_message exception;begin for i in 100 .. 1000 loop num_ := num_ + 1; code_ := code_ + 1; insert into tpj_gf_ma_invoiceinfo values (i, num_, code_,); end loop; c

.net 调用Oracle.DataAccess.Client批量增加数据

1.添加引用 using Oracle.DataAccess.Client; using System.Configuration; 2.代码 增加方法 //DestinationTableName 表名 //connectionString 连接 string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString; config配置文件

c#调用存储过程实现批量增加和修改数据

1 例如当我在编辑表格数据,一次编辑了多行需要保存到数据库时,就需要判断数据库中是否已经存在,存在则修改,不存在则新增一条或多条数据,即所谓批量增加或者跟新数据. 首先需要构建数据包,把要添加或者跟新的数据构建成一个datatable,例如我数据库中的表结构是这样 CREATE TABLE [dbo].[FlagDescription]( [FundId] [CHAR(10)] not null, [SurveyType] [tinyint] not null, [DefectReason] T

ThinkPHP3.2基础教程(20)--模型-CURD操作-数据写入

ThinkPHP的数据写入操作使用add方法,使用示例如下: $User = M("User"); // 实例化User对象 $data['name'] = 'ThinkPHP'; $data['email'] = '[email protected]'; $User->add($data); 如果是Mysql数据库的话,还可以支持在数据插入时允许更新操作: add($data='',$options=array(),$replace=false) 其中add方法增加$repla

Sql语句批量更新数据(多表关联)

最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid不是想要的,面临要批量更新原来数据depid的问题. 更新涉及到三个表base_cooperativeGroup,base_groupuser,base_user. 列出表结构: 1.base_cooperativeGroup 2.base_groupuser 3.base_

批量添加数据

C#批量向数据库增加数据: ----------------------------- using (var dbPlatform = DbContext.PlatformWorkCreate())                 {                     var CId = dbPlatform.Query<LQ_WaWaShowCategory>().Where(t => t.CategoryNameEn == "dianzijiaocai").

MSSQL批量写入数据方案

近来有一个项目Feature需要有批量写入数据的场景,正巧整理资料发现自己以前也类似实现的项目,在重构的同时把相关资料做了一个简单的梳理,方便大家参考. 循环写入(简单粗暴,毕业设计就这样干的)(不推荐) Bulk Copy写入(>1000K 记录一次性写入推荐) 表值参数方式写入(mssql 2008新特性)(强烈推荐) 在SQL Server 2008未提供表值参数之前,需要将多行数据传递到存储过程或参数化sql命令我们一般会采用以下几个方法: 使用一系列单参数来表示多个数据列和行中的值.但

Excel批量导入数据之数据校验

最近,工作上接到Excel批量导入数据的需求.在这里,小编想分享的是数据校验那些事,至于如何读取Excel数据,大家可以百度下. 一般而言,Excel批量导入数据,我们都会给客户提供一个固定的模板以输入我们期望的数据.然而,客户的操作,我们是无法预料的,他们有可能增加一列或者删除一列,有可能去掉Excel某个字段的输入限制等等. Excel模板,有可能只有一个,有可能若干个.各个模板的数据列,或交叉相同,或存在个性化列. 同一个模板,也许因某列数据的不同,而需要填充不同数据列. ...... 面

hibernate 批量增加 修改 删除

4.2  Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete()方法来删除持久化对象,Hibernate将负责删除对应的数据记录:当执行持久化对象的set方法时,Hibernate将自动转换为对应的update方法,修改数据库的对应记录. 问题是如果需要同时更新100?000条记录,是不是要逐一加载100?000条记录,然后依次调用set方法——这样不仅繁琐