|
1、数据工厂
define 定义了一个指定数据模型(如此例子 User)的模型工厂。define 方法接收两个参数,第一个参数为指定的 Eloquent 模型类,第二个参数为一个闭包函数,该闭包函数接收一个 Faker PHP 函数库的实例,让我们可以在函数内部使用 Faker 方法来生成假数据并为模型的指定字段赋值。 我们需要增加 introduction 用户简介字段的填充,另外我们计划在 UsersTableSeeder 里使用 批量入库 的方式填充数据,因此需要自行填充 created_at 和 updated_at 两个字段。修改后的代码如下: database/factories/UserFactory.php
<?php
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(App\Models\User::class, function (Faker $faker) {
$date_time = $faker->date . ' ' . $faker->time;
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'remember_token' => Str::random(10),
'email_verified_at' => now(),
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'introduction' => $faker->sentence(),
'created_at' => $date_time,
'updated_at' => $date_time,
];
});
Faker 是一个假数据生成库,sentence() 是 faker 提供的 API ,随机生成『小段落』文本。我们用来填充 introduction 个人简介字段。
2、数据填充
使用以下命令生成数据填充文件:
php artisan make:seed UsersTableSeeder
修改文件如以下: database/seeds/UsersTableSeeder.php
<?php
use Illuminate\Database\Seeder;
use App\Models\User;
class UsersTableSeeder extends Seeder
{
public function run()
{
// 获取 Faker 实例
$faker = app(Faker\Generator::class);
// 头像假数据
$avatars = [
'/images/01.png',
'/images/02.png',
'/images/03.png',
'/images/04.png',
'/images/05.png',
];
// 生成数据集合
//use()方法连接闭包和外界的变量(使用外包变量,以及闭包函数传参)
//说的更明白点:use关键字用来引用外部的变量
//在函数内部通过使用use关键字,使用父函数的变量,这种方式叫闭包函数
$users = factory(User::class)
->times(10)
->make()
->each(function ($user, $index)
use ($faker, $avatars)
{
// 从头像数组中随机取出一个并赋值
$user->avatar = $faker->randomElement($avatars);
});
// 让隐藏字段可见,并将数据集合转换为数组
$user_array = $users->makeVisible(['password', 'remember_token'])->toArray();
// 插入到数据库中
User::insert($user_array);
// 单独处理第一个用户的数据
$user = User::find(1);
$user->name = 'Summer';
$user->email = 'summer@example.com';
$user->avatar = '/images/pic.png';
$user->save();
}
}
代码讲解#
顶部使用 use 关键词引入必要的类。 factory(User::class) 根据指定的 User 生成模型工厂构造器,对应加载 UserFactory.php 中的工厂设置。 times(10) 指定生成模型的数量,此处我们只需要生成 10 个用户数据。 make() 方法会将结果生成为 集合对象。 each() 是 集合对象 提供的 方法,用来迭代集合中的内容并将其传递到回调函数中。 use 是 PHP 中匿名函数提供的本地变量传递机制,匿名函数中必须通过 use 声明的引用,才能使用本地变量。 makeVisible() 是 Eloquent 对象提供的方法,可以显示 User 模型 $hidden 属性里指定隐藏的字段,此操作确保入库时数据库不会报错。
1、
$age = 30;
$c = function ($name) use ($age){
?? ?echo 'this is' . $name .' Age is '. $age;
};
$c('jcc');
//闭包内需要调用外部的变量,需要使用use关键字来引用外部的变量
2、通过下面的代码能彻底明白UsersTableSeeder.php中,
->each(function ($user, $index) 里面$user 和 $index
<?php
$arr1 = ['张三', '李四', '王五', '赵六', '孙七'];
echo "<pre>";
var_dump($arr1);
echo "</pre>";
$to_arr1 = ' 是好人!';
//使用闭包函数,代替foreach
array_walk($arr1, function($v, $k) use ($to_arr1){
echo $v;
echo "<br>";
echo $k;
echo "<br>";
});
echo "<pre>";
var_dump($arr1);
echo "</pre>";
//--------------------
factory(App\User::class) 指明返回哪个工厂,参数 App\User::class 就是工厂的唯一标识。这里我们在定义工厂的时候 define 的第一个参数已经指明了。->times(10) 指明需要工厂模式生成 10 个 User 数据。即会调用 10 次 define 函数的第二个参数。->make() 把生成的 10 个 User 数据封装成 Laravel 中的集合对象。->each() 是 Laravel 集合中的函数,each 函数会针对集合中的每个元素进行操作。这里直接把数据保存到数据库
//---------------------
3、注册数据填充
接下来注册数据填充类,先去掉 $this->call(UsersTableSeeder::class); 的注释,还要注释掉我们还未开发 TopicsTableSeeder 调用: database/seeds/DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(UsersTableSeeder::class);
// $this->call(TopicsTableSeeder::class);
}
}
4、使用以下命令运行迁移文件
php artisan db:seed
Laravel 中的数据迁移和数据填充
数据库测试:模型工厂生成及使用
|