下面由laravel教程欄目給大家介紹Laravel Seeder生成百萬模擬數據,希望對需要的朋友有所幫助!
laravel 集成了 faker 庫,并提供了 seeder 可以幫助我們輕松地生成模擬數據。
先書寫數據倉庫和數據填充代碼
數據倉庫代碼
use AppModelsTopic;use FakerGenerator as Faker;$factory->define(Topic::class, function (Faker $faker) { $sentence = $faker->sentence(); // 隨機取一個月以內的時間 $updated_at = $faker->dateTimeThisMonth(); // 傳參為生成最大時間不超過,因為創建時間永遠比更改時間要早 $created_at = $faker->dateTimeThisMonth($updated_at); return [ 'title' => $sentence, 'body' => $faker->text(), 'excerpt' => $sentence, 'created_at' => $created_at, 'updated_at' => $updated_at, ];});
數據填充代碼
class TopicsTableSeeder extends Seeder{ /** * Run the database seeds. * * @return void */ public function run() { // 所有用戶ID數組,如:[1,2,3,4] $user_ids = User::all()->pluck('id')->toArray(); // 所有分類 ID 數組,如:[1,2,3,4] $category_ids = Category::all()->pluck('id')->toArray(); // 獲取 Faker 實例 $faker = app(FakerGenerator::class); $topics = factory(Topic::class) ->times(1000) ->make() ->each(function ($topic, $index) use ($user_ids, $category_ids, $faker){ // 從用戶 ID 數組中隨機取出一個并賦值 $topic->user_id = $faker->randomElement($user_ids); // 話題分類,同上 $topic->category_id = $faker->randomElement($category_ids); }); // 將數據集合轉換為數組,并插入到數據庫中 Topic::insert($topics->toArray()); }}
我們通過是 times() 設置了填充的次數,執行數據填充命令,可以將 1000 條數據填充至 topics 表中,這很方便。
php artisan db:seed --class=TopicsTableSeeder
如果我們想要插入 100w 條數據,是不是把 times() 的參數改為 1000,000 就可以了?當你這樣做之后,你會發現如下報錯
General error: 1390 Prepared statement contains too many placeholders
這個問題是因為 mysql 默認支持的占位符最多為 65535(2^16-1) 個,寫入數據為 m 列,n 行。m*n 必須小于 65535。
所以沒法一次性插入大量數據,查了一下 php artisan db:seed 也沒有提供執行次數的相關參數。
最后,決定使用 shell 腳本進行解決。
for (( i = 0; i < 1000; i++ )); do /usr/local/bin/php artisan db:seed --class=TopicsTableSeederdone
等待片刻,你會發現 100w 數據已經生成完畢!
PS:數據倉庫和數據填充代碼來自 larabbs
推薦:最新的五個Laravel視頻教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END