Menu

009. 逆向 Seed 生成器——orangehill/iseed

逆向 Seed 生成器——orangehill/iseed

这一节我们来了解一下 orangehill/iseed 这个扩展包,单看描述可能不太理解这个包的作用,它是一个逆向的 Seed 文件生成器,也就是根据数据库中已存在的数据,帮助我们生成 Seed 文件。

场景分析

什么样的场景我们会使用到这个扩展包呢?从功能上看,这个扩展包的作用很像是将数据库中的数据导出,通过 Seed 文件,方便我们再次将数据导回数据库。比起我们直接从数据库导出 sql 文件,orangehill/iseed 帮助我们生成了 Seed 文件,这样我们可以进行修改,并提交到代码仓库中,维护性得到了大大的提高。

举个我们很可能遇到的场景:

我们的项目中很可能有 分类广告首页轮播图 这样的功能,我们在本地测试的时候,可以通过 Eloquent模型的工厂 生成一些随机的数据进行本地开发。但是到了测试阶段,其他部门的同事可能会直接将准备好的文案(excel,markdown,txt)发给我们,让我们自行导入数据库。同时我们希望所有开发及测试环境的数据都以该数据为准,而不是一些填充的假数据。可能有如下方法:

  1. 根据文案,手动编写 Seed 文件;
  2. 编写脚本,读取准备好的文件,将数据插入数据库;
  3. 在某个测试环境的管理后台,或者数据库中,将内容编辑好,然后将数据导出,通过脚本或者手动导入的方式统一他人环境。

orangehill/iseed 则是将上述的第三种方法变得更加方便和可控。

安装

orangehill/iseed 的功能是辅助开发人员生成 Seed,所以我们应该将它安装在开发环境:

$ composer require orangehill/iseed --dev

file

使用

结合 LaraBBS 的场景,在主页的右下角会有 资源推荐 的版块,其中的数据是我们通过 faker 生成的测试数据,数据其实很简单,只有标题和链接。

file

看一下数据库中的结构:

file

如果我们精心整理好了标题和链接,希望以后开发和测试环境中的数据都固定下来,而不是随机生成的,那么可以直接通过 orangehill/iseed 将数据库中准备好的数据导出为 Seed 文件。

使用 php artisan iseed table_name 即可导出对应的表,这里我们导出 links 表。

$ php artisan iseed links

file

运行时会提示我们 LinksTableSeeder.php 已经存在,是否要覆盖该文件,因为之前我们创建过 database/seeds/LinksTableSeeder.php,使用的随机的假数据,所以需要选择 yes,覆盖掉。

打开 database/seeds/LinksTableSeeder.php

database/seeds/LinksTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class LinksTableSeeder extends Seeder
{
    public function run()
    {
        \DB::table('links')->delete();

        \DB::table('links')->insert(array (
            0 =>
            array (
                'id' => 1,
                'title' => 'Myrna Mraz',
                'link' => 'http://watsica.info/cupiditate-quas-nulla-et-blanditiis-corporis-nisi',
                'created_at' => NULL,
                'updated_at' => NULL,
            ),
            .
            .
            .
        ));
    }

可以看到代码逻辑很简单,先将 links 表中的所有数据删除,然后再将数据插入表中。

orangehill/iseed 还提供了一些额外的参数,帮助我们不同的导出需求,例如:

  • --force —— 强制覆盖已有文件;
  • --max —— 最多导出多少条;
  • --exclude —— 不包含的字段。

下面我们尝试一下如下命令:

$ php artisan iseed links --force --max=5 --exclude=created_at,updated_at

file

参数意思是强制覆盖已存在的 Seed 文件,最多导出 5 条,不包含 created_atupdated_at字段。

再次打开 database/seeds/LinksTableSeeder.php,查看:

<?php

use Illuminate\Database\Seeder;

class LinksTableSeeder extends Seeder
{
    public function run()
    {
        \DB::table('links')->delete();

        \DB::table('links')->insert(array (
            0 =>
            array (
                'id' => 1,
                'title' => 'Myrna Mraz',
                'link' => 'http://watsica.info/cupiditate-quas-nulla-et-blanditiis-corporis-nisi',
            ),
            .
            .
            .
        ));
    }

完全正确符合预期。

代码版本控制

orangehill/iseed 就是这样一个简单实用的扩展包,相信你已经学会了,最后将我们修改的 Seed 文件提交至代码库。

$ git add -A
$ git commit -m 'add orangehill/iseed'

本文章首发在 Laravel China 社区
上一篇 下一篇
讨论数量: 0
发起讨论



暂无话题~
刻意练习,每日精进。
33
点赞
2921
浏览
0
讨论