美文网首页laravel
大批量假数据填充的正确方法

大批量假数据填充的正确方法

作者: 足迹人生2017 | 来源:发表于2018-06-27 16:18 被阅读1次

    说明

    开发 数据填充 时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。

    只有当 db:seed 运行起来很快的时候,才能完全利用数据填充工具带来的便利,而不是最后变成累赘。

    模型工厂

    Laravel 的官方文档中,建议 使用模型工厂来填充数据 ,在日常使用中,需要注意以下。

    避免使用 create 方法

    在使用 模型工厂函数 来书写假数据插入逻辑时,要注意避免使用 create 方法,因为每一次就是一条 SQL 语句。

    factory(\App\Models\User::class)->times(300)->create();
    

    以下截图是一个使用 factory 辅助函数的例子,插入 300 条数据,总共执行了 602 条 SQL 语句,总执行时长为 23.91 秒。

    file

    轻轻松松运行时间就累积起来了,你能想象运行一次 db:seed 要半个小时是什么感觉么?

    c4o3E6gq7W.png

    正确的做法:使用 make 方法

    $users = factory(\App\Models\User::class)->times(1000)->make();
    \App\Models\User::insert($users->toArray());
    
    file

    传统方式

    一个错误的例子

    下面代码执行了 1000 条 SQL 语句,在书写数据填充的时候,也是要尽量避免。

    $faker = Faker::create();
    $users = User::lists('id');
    
    foreach (range(1, 1000) as $index)
    {
        Topic::create([
            'user_id'     => $faker->randomElement($users),
            'title'       => $faker->sentence(),
            'description' => $faker->text(),
        ]);
    }
    

    解决方案

    使用 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。

    --- EOF ---

    本文章首发在 Laravel China 社区

    相关文章

      网友评论

        本文标题:大批量假数据填充的正确方法

        本文链接:https://www.haomeiwen.com/subject/wgxiyftx.html