自学笔记之laravel-假数据填充数据库

1,687 阅读2分钟

在实际的项目开发过程中,我们需要做假数据来测试。Laravel 提供了一套更加现代化、非常简单易用的数据填充方案(Faker扩展包)。接下来让我们使用 Laravel 提供的数据填充来批量生成假用户。

假数据的生成分为两个阶段:

1.对要生成假数据的模型指定字段进行赋值 - 『模型工厂』 ;

2.批量生成假数据模型 - 『数据填充』

模型工厂

假设要在users表中生成测试数据,进入到User项目中的工厂模型中

database/factories/UserFactory.php 系统文件默认如下


use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

define方法第一个参数为指定的Eloquent模型类,第二个参数是一个闭包函数,这个闭包函数接收一个FakerPHP函数库的实例

我们就来修改这个User的模型工厂

database/factories/UserFactory.php


use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\Models\User::class, function (Faker $faker) {
    $date_time = $faker->date . '' . $faker->time();
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'), // secret
        'remember_token' => str_random(10),
        'created_at' => $date_time,
        'updated_at' => $date_time,
    ];
});

数据填充

laravel中提供了Seeder类让我们随意进行数据表的填充。 所有的 Seeder 类文件都放在 database/seeds 目录下,文件名需要按照 『大驼峰式』 来命名,且严格遵守大小写规范。Laravel 默认为我们定义了一个 DatabaseSeeder 类,我们可以在该类中使用 call 方法来运行其它的 Seeder 类,以此控制数据填充的顺序。我们可以使用下面命令来生成一个 UsersTableSeeder 文件,用于填充用户相关的假数据。

$ php artisan make:seeder UsersTableSeeder

在我们定义好了用户模型工厂之后,便可以在生成的用户数据填充文件中使用 factory 这个辅助函数来生成一个使用假数据的用户对象。 进入到命令生成的Seeder类中的Users(注意:这里模型工厂中的User是单数,seeder类中是Users复数)

database/seeds/UsersTableSeeder.php ps:引入填充模型


use Illuminate\Database\Seeder;
use App\Models\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = factory(User::class)->times(50)->make();
        User::insert($users->makeVisible(['password', 'remember_token'])->toArray());

        $user = User::find(1);
        $user->name = 'Aufree';
        $user->email = 'aufree@yousails.com';
        $user->password = bcrypt('password');
        $user->save();
    }
}

timesmake 方法是由 FactoryBuilder 类 提供的 API。times 接受一个参数用于指定要创建的模型数量,make 方法调用后将为模型创建一个 集合。makeVisible 方法临时显示 User 模型里指定的隐藏属性 $hidden,接着我们使用了 insert 方法来将生成假用户列表数据批量插入到数据库中。最后我们还对第一位用户的信息进行了更新,方便后面我们使用此账号登录。

接着我们还需要在 DatabaseSeeder 中调用 call 方法来指定我们要运行假数据填充的文件。

database/seeds/DatabaseSeeder.php ps:引入Eloquent模型


use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        $this->call(UsersTableSeeder::class);

        Model::reguard();
    }
}

完成上面操作之后,我们便可以开始为用户生成批量假数据了,在运行生成假数据的命令之前,我们需要使用 migrate:refresh 命令来重置数据库,之后再使用 db:seed 执行数据填充。

$ php artisan migrate:refresh
$ php artisan db:seed

如果我们要单独指定执行 UserTableSeeder 数据库填充文件,则可以这么做:

$ php artisan migrate:refresh
$ php artisan db:seed --class=UsersTableSeeder

你也可以使用下面一条命令来同时完成数据库的重置和填充操作:

$ php artisan migrate:refresh --seed
本笔记来自于laravel-china @Summer@Aufree