模型工厂笔记"/>
laravel模型工厂笔记
测试时,通常需要在执行测试前插入新数据到数据库。'模型工厂' 就是为了创建测试数据!
Laravel允许你使用”factories”为每个Eloquent模型定义默认的属性值集合,而不用手动为每一列指定值。
每个模型工厂,继承了 'Faker' 类,可查看 '',专门生成随机数据!1>文件路径:database/factories/ModelFactory.php2>工厂定义:// 下面是laravel默认的定义,User - 用户模型$factory->define(App\User::class, function (Faker\Generator $faker) {return ['name' => $faker->name,'email' => $faker->email,'password' => bcrypt(str_random(10)),'remember_token' => str_random(10),];});3>我们可以添加其它Eloquent模型的工厂定义,例如:Role - 角色模型$factory->define(App\Role::class, function (Faker\Generator $faker) {return ['name' => $faker->name,];});4>同一个Eloquent模型类,生成多个工厂。例如,除了正常用户外可能你想要为“管理员”用户生成一个工厂,你可以使用defineAs方法定义这些工厂:注意:使用的是 'defineAs()' 方法// User - 用户模型中的 'admin' 用户类型$factory->defineAs(App\User::class, 'admin', function ($faker) {return ['name' => $faker->name,'email' => $faker->email,'password' => str_random(10),'remember_token' => str_random(10),'admin' => true,];});5>仍旧是同一个Eloquent模型类,生成多个工厂。但可以使用raw方法获取基本属性而不用重复基本用户工厂中的所有属性,获取这些属性后,只需将你要求的额外值增补进去即可:$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) { // 这里匿名函数定义后多了一个 'use ($factory)'$user = $factory->raw(App\User::class); // 获取最初的用户模型的字段属性return array_merge($user, ['admin' => true]); // 扩展额外的字段即可!});6>使用工厂:1)make()创建模型但不将其保存到数据库:public function testDatabase(){$user = factory(App\User::class)->make();// 用户模型测试...}2)如果你想要覆盖模型的一些默认值,可以传递数组值到make方法。只有指定值被替换,其他数据保持不变:public function testDatabase(){$user = factory(App\User::class)->make(['name' => 'dongxuemin' // 会将生成的name替换为 'dongxuemin']);// 用户模型测试...}3)创建多个模型集合:$users = factory(App\User::class, 3)->make();4)创建给定类型的集合:$user = factory(App\User::class, 'admin')->make();5)创建多个给定类型的集合:$user = factory(App\User::class, 'admin', 3)->make();6)持久化工厂模型:使用create()方法,不仅能创建模型实例,还可以使用 Eloquent 的 save()方法,将生成的数据保存到数据库create()使用方法,同 'make()' 完全一致create()+save(),可保存到数据库7)添加关联关系到模型:create()创建一个模型集合,对于集合,可以使用 'each()' 方法,处理集合中的每一个数据实例$users = factory(App\User::class, 3)->create() // 创建了3个元素的集合->each(function($u) { // each()回调,处理每个集合$u->posts()->save(factory(App\Post::class)->make()); // 建立和 'Post' 的关联关系});
更多推荐
laravel模型工厂笔记
发布评论