laravel模型工厂笔记

测试时,通常需要在执行测试前插入新数据到数据库。'模型工厂' 就是为了创建测试数据!
Laravel允许你使用”factories”为每个Eloquent模型定义默认的属性值集合,而不用手动为每一列指定值。
每个模型工厂,继承了 'Faker' 类,可查看 'https://github.com/fzaninotto/Faker',专门生成随机数据!
	1>文件路径:
		database/factories/ModelFactory.php
	2>工厂定义:
		// 下面是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框架)