项目开发时,一般都会有到项目测试数据的准备操作,以前都是基于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。 看看源码,看看流程你就知道啦。

想要详细的获取测试源码、交流项目开发的技术问题。可以加入技术交流群进行探讨

最新文章

  1. 『.NET Core CLI工具文档』(十三)dotnet-publish
  2. php实战正则表达式:验证手机号
  3. jquery Mobile弹出窗
  4. Activiti系列:是否可以让某些流程的信息写到历史表,而另外一些不写?
  5. TestNG超详细教程
  6. java-过滤器-监听器-拦截器
  7. java登陆验证码与JS无刷新验证
  8. oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
  9. linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数
  10. Java图片工具类,完成图片的截取和任意缩放
  11. [Python笔记][第二章Python序列-复杂的数据结构]
  12. 灵动标签的使用方法 ecms通过运行sql获取须要的记录
  13. BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
  14. .NET中数据访问方式(一):LINQ
  15. 数据结构--hashtable(散列表)
  16. Oracle Applications DBA 基础(二)
  17. [TJOI2009]猜数字
  18. PHP----------安装包lnmp1.3-full安装的lnmp环境,如何安装PHP扩展
  19. SimpleDateFormat 使用时出现的线程同步问题。。。
  20. 前端开发 - JavaScript

热门文章

  1. pom父工程dependencyManagement中的jar包在子工程中不写版本号无法引入的问题
  2. 16.Django学习之文件上传和下载
  3. I_want_all 2019训练记录
  4. NAT(地址解析协议)
  5. Django 06
  6. 【Web技术】399- 浅谈前端代码加密
  7. web性能优化指南
  8. python学习-dict
  9. SVN重新定位操作流程
  10. c++之指针