天天看点

TP5系列 | 使用Seeder数据填充数据

Seeder 的介绍

Seeder 是干嘛用的呢?谷歌翻译为:播种机。

在 Thinkphp5 这里呢,我们叫它 数据填充器。相信大家都有这样的经历:项目开发中,我们经常需要自己手动的模拟数据,在模拟数据之后在进行项目测试,但是自己手动模拟数据太麻烦了,比如,数据格式,需要手写 SQL或者写 foreach 等,其实这上面都是其次

如果项目是多个小伙伴一起开发,小伙伴们使用的是本地的数据库那就蛋疼呐,小伙伴也需要自己模拟相应的数据,或者你备份一份 SQL 文件通过微信传给他,这就显得麻烦了,一件事情一旦重复做过3次,我们就应该考虑用程序去替代手工。

所以呢,Seeder 就出现了,它负责模拟生成项目中需要的数据,它并不是保存数据而是在数据需要的时候只要执行一条命令就能自动的生成,由于事先约定好了数据格式,所以生成的模拟数据基本符合项目情况,这样项目开发中小伙伴们的数据库中的数据都基本一致啦。

Seeder 的创建

在 Thinkphp5 项目中,可以在命令行输入下面这条命令:

php think seed:create VideoSeeder           

复制

文件内容

<?php

use think\migration\Seeder;

class VideoSeeder extends Seeder
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     */
    public function run()
    {

    }
}           

复制

代码非常的简单,默认的给出了一个 run 方法,现在我们都知道 seeder 文件是用来产生模拟数据的,而产生模拟数据的代码写在 run 方法中就可以了。

seed:run 方法

给数据表 Video模拟生成200条数据

<?php

use think\migration\Seeder;

class VideoSeeder extends Seeder
{
    public function run()
    {
        $rows = [];
        for ($i = 0; $i < 200; $i++) {
            $rows[] = [
                'name' => mt_rand(10000, 99999),
                'email' => mt_rand(10000, 99999).'@qq.com',
                'password' => md5('123456'),
                'upload_time' => time(),
                'user_id' => rand(1111,9999),
            ];
        }

        $this->table('video')->insert($rows)->save();
    }
}           

复制

注意:一定要调用 save() 方法,否则不会保存的。

首先,生成了200条数据,然后调用

$this->table('video')->insert($rows)->save();

将生成的数据插入到数据库的

Video

表中。

执行 Seeder

Seeder 文件定义好了之后,还必须得执行一下数据才能插入到数据库中,执行命令:

# php think seed:run

 == VideoSeeder: seeding
 == VideoSeeder: seeded 9.1847s

All Done. Took 9.1958s           

复制

执行成功提示:All Done. Took 9.1958s。

查看数据表数据

mysql> select * from iot_video;
+-----+-------+--------------+----------------------------------+-------------+---------+
| id  | name  | email        | password                         | upload_time | user_id |
+-----+-------+--------------+----------------------------------+-------------+---------+
|   1 | 65100 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 6331    |
|   2 | 34635 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 2250    |
|   3 | 56031 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 4053    |
|   4 | 29050 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 4853    |
|   5 | 86527 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 8294    |
|   6 | 21446 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 4365    |
...
| 199 | 42923 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 4340    |
| 200 | 61223 | [email protected] | e10adc3949ba59abbe56e057f20f883e | 1564908849  | 2455    |
+-----+-------+--------------+----------------------------------+-------------+---------+
200 rows in set (0.37 sec)           

复制

数据全部添加完毕了

通过faker模拟生成真实数据

在实际项目开发中,我们需要的数据格式是丰富的,并不是简单的通过生成随机数来模拟真实数据就可以的。

比如说我们要生成可以看得懂的用户呢称,IP地址,用户住址,假图片等我们可能需要的更多信息,如果这些信息要靠我们自己去编写规则显然也是非常麻烦的。

安装 Faker

composer require fzaninotto/faker           

复制

地址:https://github.com/fzaninotto/Faker

修改代码

class VideoSeeder extends Seeder
{
    public function run()
    {
        $faker = Faker\Factory::create($locale = 'zh_CN');
        $rows = [];
        for ($i = 0; $i < 100; $i++) {
            $rows[] = [
                'name' => $faker->name,
                'email' => $faker->email,
                'password' => $faker->password,
                'upload_time' => $faker->unixTime,
                'user_id' => rand(1111,9999)
            ];
        }
        $this->table('video')->insert($rows)->save();
    }
}           

复制

开始进行数据库填充 (方便测试,先删除以前的数据哦)

# php think seed:run

 == VideoSeeder: seeding
 == VideoSeeder: seeded 4.8271s

All Done. Took 4.8396s           

复制

查看数据表数据

mysql> select * from iot_video;
+-----+--------+--------------------------------+----------------------+-------------+---------+
| id  | name   | email                          | password             | upload_time | user_id |
+-----+--------+--------------------------------+----------------------+-------------+---------+
|   3 | 台雪梅 | [email protected]         | 6NuLx(SRn/Wp+v10     | 990482227   | 2900    |
|   4 | 伏强   | [email protected]          | o)79cw77Sg=;w        | 308779897   | 5244    |
|   5 | 季欣   | [email protected]                 | mrm^/`F3k;           | 789426165   | 2889    |
|   6 | 巫婷   | [email protected]               | OmRq}l)tk            | 1545825638  | 8183    |
|   7 | 穆兰英 | [email protected]              | $WZpcj};`b~*Ib!      | 1485805110  | 7270    |
|   8 | 纪婕   | [email protected]         | 0U{T0>5OpGQa_o"`     | 1247318429  | 8368    |
|   9 | 沙荣   | [email protected]                | @R#0't~+sVM*{D8_l    | 319956341   | 2320    |
...
| 100 | 文博   | [email protected]         | .gq$Dpn=/|i          | 484145624   | 5560    |
| 101 | 揭秀云 | [email protected]              | jXyU2m`$^)L0Cxp6im   | 1255679636  | 6511    |
| 102 | 华静   | [email protected]         | *dF)h4\n             | 123150462   | 6602    |
+-----+--------+--------------------------------+----------------------+-------------+---------+
100 rows in set (0.43 se           

复制

生成的数据非常的人性化,测试的时候也就更加方便了