首頁 > php框架 > Laravel > 詳解Laravel Seeder如何產生百萬模擬數據

詳解Laravel Seeder如何產生百萬模擬數據

藏色散人
發布: 2021-03-30 09:14:06
轉載
2853 人瀏覽過

Laravel 整合了 Faker 函式庫,並提供了 Seeder 可以幫助我們輕鬆地產生模擬資料。

先書寫資料倉儲和資料填充代碼

詳解Laravel 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中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板