樓主最近在學習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函數就是這樣找來的!