🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 数据填充 ## 简介 所有的填充类都放在`database/seeds`目录下。你可以随意为填充类命名, 但是更建议您遵守类似`UsersTableSeeder`的命名规范。通常, Laravel 默认定义了一个`DatabaseSeeder`类。通过这个类,你可以用`call`方法来运行其它的 seed 类从而控制数据填充的顺序。 ## 编写 Seeders ``` // 生成 Seeder $ php artisan make:seeder UsersTableSeeder ``` 一个 seeder 类只包含一个默认方法:`run`。 这个方法会在执行`db:seed`这个[Artisan 命令](https://learnku.com/docs/laravel/5.8/artisan)时被调用。 在`run`方法里你可以根据需要在数据库中插入数据。你也可以用[查询构造器]或[Eloquent 模型工厂]来手动插入数据。 > 提示:[批量赋值保护]会在数据填充时自动禁用。 ``` // 添加一条数据插入语句 <?php use Illuminate\Support\Str; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => bcrypt('secret'), ]); } } ``` ### 使用模型工厂 当然,手动为每个模型填充指定属性很麻烦。作为替代方案,你可以使用[model 工厂](https://learnku.com/docs/laravel/5.8/database-testing#writing-factories)轻松地生成大量数据库数据。 首先, 阅读[model 工厂文档](https://learnku.com/docs/laravel/5.8/database-testing#writing-factories)来学习如何定义工厂文件,一旦定义好了你的工厂文件,然后就可以使用`factory`这个辅助函数来向数据库中插入数据。 例如,创建 50 个用户并为每个用户创建关联: ``` /** * 运行数据库填充。 * * @return void */ public function run() { factory(App\User::class, 50)->create()->each(function ($u) { $u->posts()->save(factory(App\Post::class)->make()); }); } ``` ### 调用其它 Seeders ``` // 在 DatabaseSeeder 类中,你可以使用 call 方法来运行其它的 seed 类。 /** * 运行数据库 seeds。 * * @return void */ public function run() { $this->call([ UsersTableSeeder::class, PostsTableSeeder::class, CommentsTableSeeder::class, ]); } ``` ## 运行 Seeders ``` // 重新生成 Composer 的自动加载器 $ composer dump-autoload // 填充数据库 $ php artisan db:seed // 指定一个特定的 seeder 类 $ php artisan db:seed --class=UsersTableSeeder // 回滚并重新运行所有迁移,重建数据库 $ php artisan migrate:refresh --seed ```