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函数就是这样找来的!