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    = 'thinkphp@qq.com';
 6 $user->save();
 7 
 8 //method 2
 9 // 使用model助手函数实例化User模型
10 $user = model('User');
11 // 模型对象赋值
12 $user->data([
13     'name'  =>  'thinkphp',
14     'email' =>  'thinkphp@qq.com'
15 ]);
16 $user->save();
17 
18 //多条数据新增
19 //method 1
20 $user = new User;
21 $list = [
22     ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
23     ['name'=>'onethink','email'=>'onethink@qq.com']
24 ];
25 $user->saveAll($list);
26 
27 //method 2
28 $user = new User;
29 $list = [
30     ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
31     ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],
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'  => 'shangwushe@gmail.com',
 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'  => 'shangwushe@gmail.com',
 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函数就是这样找来的!

posted @ 2017-11-07 15:32  gxkx  阅读(9183)  评论(0编辑  收藏  举报