加入你想一次性插入大量的测试数据 ,那么在 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 的第一个参数已经指明了。
->times(10) 指明需要工厂模式生成 10 个 User 数据。即会调用 10 次 define 函数的第二个参数。
->make() 把生成的 10 个 User 数据封装成 Laravel 中的集合对象。
->each() 是 Laravel 集合中的函数,each 函数会针对集合中的每个元素进行操作。这里直接把数据保存到数据库。
好了,数据迁移和数据填充的基本操作也就这些了。更多复杂的用法。。。。也不一定能用上。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章: