Laravel集成了Faker库,提供了Seeder来帮助我们轻松生成模拟数据。先写数据仓库和数据填充代码数据仓库代码useApp\Models\Topic;useFaker\GeneratorasFaker;$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,];});数据填充代码classTopicsTableSeederextendsSeeder{/***运行数据库种子。**@returnvoid*/publicfunctionrun(){//所有用户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(主题::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表中,非常方便方便的phpartisandb:seed--class=TopicsTableSeeder如果我们想要插入100w条数据,是不是直接把times()的参数改成1000000就可以了?这样做的时候会发现报如下错误:Generalerror:1390Preparedstatementcontainstoomanyplaceholders这个问题是因为mysql默认最多支持65535(2^16-1)个占位符,写入的数据是m列,n行。m*n必须小于65535,所以不可能一次性插入大量数据。查了phpartisandb:seed,没有执行次数的相关参数。最后还是决定用shell脚本来解决。对于((i=0;i<1000;i++));do/usr/local/bin/phpartisandb:seed--class=TopicsTableSeederdone稍等片刻,你会发现生成了100w条数据!PS:数据仓库和数据填充代码来自larabbs
