Laravel 整合了 Faker 函式庫,並提供了 Seeder 可以幫助我們輕鬆地產生模擬資料。
先書寫資料倉儲和資料填充代碼資料倉儲代碼
use App\Models\Topic;use Faker\Generator 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(Faker\Generator::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影片教學
以上是詳解Laravel Seeder如何產生百萬模擬數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!