如果我们有多个表要进行数据填充,那么不可能在编写完 php 代码之后,逐个的执行 php artisan db:seeder --class=xxxx
来进行填充。有一个简便的方法。在 DatabaseSeeder 的 run 方法中添加一行 $this->call(UserTableSeeder::class);
,然后执行 php artisan db:seeder
,那么 Laravel 就会执行 DatabaseSeeder 中的 run 方法,然后逐个执行迁移。
和 migration 不同,如果多次执行 php artisan db:seeder
就会进行多次数据填充。
加入你想一次性插入大量的测试数据 ,那么在 run 方法中使用 DB facade 来逐个插入显然不是一个好的方法。Laravel 中提供了一种模型工厂的方式来创建创建大量的数据。
模型工厂
模型工厂,意味着本质其实是一个工厂模式。那么,在使用模型工厂创建数据需要做两件事情
Laravel 中通过执行 php artisan make:factory UserFactory --model=User
来为 User Model 创建一个工厂类,该文件会放在 database/factory 目录下。打开该文件可以看到如下代码:
$factory->define(App\User::class, function (Faker $faker) { return [ // ]; });
这里, return 的值就是我们第 2 步调用工厂获取到的数据。生成数据的逻辑也只需要写在闭包函数中就可以。这里需要提一下 Faker 这个类。这是一个第三方库,Laravel 集成了这个第三方库。这个库的作用很好玩:**用于生成假数据。**假设 User 表需要插入 100 个用户,那么就需要 100 个 username,那么你就不必自己写逻辑生成大量的 test01,test02 这样子幼稚的假数据,直接使用 Faker 类,会替你生成大量逼真的 username。(我也不知道这个算不算无聊了 :)。。。)。
现在假设 User 表有 id, email, username 三个字段,那么我要生成 100 个用户,首先在工厂类中实现逻辑。
$factory->define(App\Models\User::class, function (Faker $faker) { return [ // 直接调用 faker API 生成假数据,更多 faker 相关查看 文档。 'username' => $faker->name, 'email' => $faker->unique()->safeEmail, ]; });
现在,我们已经定义好了工厂,现在我们就要在 UserSeeder@run 函数中使用模型工厂来生成测试数据。
class UserTableSeeder extends Seeder { public function run() { factory(App\User::class)->times(10)->make()->each(function($user,$index){ $user->save(); }); } }
run 函数中这一波行云流水的链式调用在我刚刚开始接触 Laravel 的时候也是一脸黑线,不过习惯之后感觉这代码可读性确实很强
factory(App\User::class)
指明返回哪个工厂,参数 App\User::class 就是工厂的唯一标识。这里我们在定义工厂的时候 define 的第一个参数已经指明了。好了,数据迁移和数据填充的基本操作也就这些了。更多复杂的用法。。。。也不一定能用上。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。