zoukankan      html  css  js  c++  java
  • 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函数就是这样找来的!

  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/gxkB/p/7799243.html
Copyright © 2011-2022 走看看