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函數就是這樣找來的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM