larave version: 5.5.*
在开发中,总会碰到一些需要大量数据的例子,比如搜索....这时候就需要快速生成一些不重复且比较正常的数据,此时就可以使用laravel提供的数据库填充功能快速生成一些数据
数据库填充器
创建数据库填充文件
php artisan make:seeder ArticlesTableSeeder
- 创建好的文件放在
/database/seedes
- 填充的文件名建议 数据表名TableSeeder 如
ArticlesTableSeeder
修改刚刚创建的填充文件,填写需要填充的数据
use IlluminateDatabaseSeeder;
class ArticlesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// 随机插入100条数据
for ($i=0; $i<100; $i++) {
DB::table("articles")->insert([
'title' => str_random(10) , // 随机10字符串
'content' => str_random(50), // 随机50字符串
]);
}
}
}
运行填充器
php artisan db:seed
模型工厂 (推荐)
创建模型工厂
php artisan make:factory UserFactory
修改模型工厂文件
<?php
use FakerGenerator as Faker;
/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(AppUsers::class, function (Faker $faker) {
// 随机取 3 年前到现在的时间
$updatedAt = $faker->dateTimeBetween('-3 years');
$createdAt = $faker->dateTimeBetween('-3 years', $updatedAt);
return [
'username' => $faker->name,
'email' => $faker->unique()->safeEmail,
'avatar' => 'https://upload.jianshu.io/users/upload_avatars/7942449/3fac886a-3003-4f8a-8772-181d14c8b68a.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/120/h/120',
'mobile' => $faker->phoneNumber,
// decrypt password: 123456
'password' => 'eyJpdiI6InNtcmxZTzk2b1FcL0hXdFhYcTBlT3lRPT0iLCJ2YWx1ZSI6ImoyRVhzSElBc0hsU1VqNHFFV2gyMmc9PSIsIm1hYyI6Ijg4Y2I3ZjMyOGFjMDk1Yjk0YWMwNjc4NjljNTc2ZjkxMTc1MDk1OTRiM2RkZjY0YzdiZjM0NGM2MDhhOGVkZTYifQ==',
'created_at' => $createdAt,
'updated_at' => $updatedAt
];
});
- 注意填充数据库时必填字段不能为空
- 注意
created_at
和updated_at
这两个字段, 如果不需要可以在模型中设置$timestamps = false;
使用模型工厂填充数据
- 使用 tinker 命令行工具
- 使用数据库填充器 (推荐)
php artisan tinker
factory(AppUsers::class, 100)->create();
使用 tinker
这个命令后会出现一个新的命令行. 创建100条随机数据
除了使用 tinker 这个命令行工具, 模型工厂也可以结合数据库填充器使用
<?php
use IlluminateDatabaseSeeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(AppUsers::class)->times(100)->create();
}
}
关于生成随机数据的语言配置
由于默认生成的数据不是中文,如果需要生成中文的姓名,地区...
找到 /config/app.php
return [
// ... 加入这一个配置factory语言的选项
'faker_locale' => 'zh_CN',
]
factory github
https://github.com/fzaninotto/Faker
参考
https://wujunchao.com/blog/p/1157
https://broqiang.com/posts/29