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

  • 相关阅读:
    If循环初探
    Python用户交互程序
    Python 变量
    python的第一个程序
    PropertiesConfiguration读取值中包含英文逗号,用“”转义
    在windows下查看某个运行程序(或进程)的命令行参数
    eclipse open call hierarchy
    根据process杀死进程
    java在不存在文件夹的目录下创建文件
    eclipse部署web项目至本地tomcat, webapps中找不到
  • 原文地址:https://www.cnblogs.com/gxkB/p/7799243.html
Copyright © 2020-2023  润新知