項目開發時,一般都會有到項目測試數據的准備操作,以前都是基於PHP代碼自主編寫sql語句,然后循環的插入到數據庫中里面,當當我們接觸過laravel數據庫后,就可以很方便的完成項目的測試數據准備。
但在這個過程中計算用到laravel框架多少還是有有到問題,因為大家一般可能都是基於 php artisan db:seed
來進行數據填充,但隨着項目的代碼量越來越大,db:seed
的運行時間會變得越來越長,有些項目多達幾分鍾甚至幾十分鍾。
只有當 db:seed
運行起來很快的時候,才能完全利用數據填充工具帶來的便利,而不是最后變成累贅。 所以今天我們分享到的內容就是面對大量假數據需要填充的時候我們應該如何來做到改善
方案一:
模型工廠
避免使用 create 方法
在使用 模型工廠函數 來書寫假數據插入邏輯時,要注意避免使用 create
方法,因為每一次就是一條 SQL 語句。
factory(\App\Models\User::class)->times(300)->create();
以下截圖是一個使用 factory
輔助函數的例子,插入 300 條數據,總共執行了 602 條 SQL 語句,總執行時長為 23.91
秒。

輕輕松松運行時間就累積起來了,你能想象運行一次
db:seed
要半個小時是什么感覺么?
通過上圖大家可以發現每天插入都會查詢一遍然后在做一次添加,也就是大量測試數據添加的時候,我們對於數據庫的IO操作非常的多,一般在面對大量的測試數據時,都是基於把單條的插入轉化為批量的數據插入。進而提升到數據填充時間
正確的做法:使用 make
方法,在make里面方法里創建模型但不會將它們保存至數據庫
$users = factory(\App\Models\User::class)->times(1000)->make(); \App\Models\User::insert($users->toArray());

普通方式
使用 DB:insert,直接,快速,一步到位: $faker = Faker::create(); $users = User::lists('id'); $datas = []; foreach (range(1, 1000) as $index) { $datas[] = [ 'user_id' => $faker->randomElement($users), 'title' => $faker->sentence(), 'description' => $faker->text(), 'created_at' => Carbon::now()->toDateTimeString(), 'updated_at' => Carbon::now()->toDateTimeString(), ]; } DB::table('topics')->insert($datas);
只有 db:seed
運行起來很快的時候,你才可以隨時隨地,想 seed 就 seed。 看看源碼,看看流程你就知道啦。
想要詳細的獲取測試源碼、交流項目開發的技術問題。可以加入技術交流群進行探討