009. 逆向 Seed 生成器——orangehill/iseed
逆向 Seed 生成器——orangehill/iseed
这一节我们来了解一下 orangehill/iseed 这个扩展包,单看描述可能不太理解这个包的作用,它是一个逆向的 Seed 文件生成器,也就是根据数据库中已存在的数据,帮助我们生成 Seed 文件。
场景分析
什么样的场景我们会使用到这个扩展包呢?从功能上看,这个扩展包的作用很像是将数据库中的数据导出,通过 Seed 文件,方便我们再次将数据导回数据库。比起我们直接从数据库导出 sql
文件,orangehill/iseed
帮助我们生成了 Seed 文件,这样我们可以进行修改,并提交到代码仓库中,维护性得到了大大的提高。
举个我们很可能遇到的场景:
我们的项目中很可能有 分类
,广告
,首页轮播图
这样的功能,我们在本地测试的时候,可以通过 Eloquent模型的工厂 生成一些随机的数据进行本地开发。但是到了测试阶段,其他部门的同事可能会直接将准备好的文案(excel,markdown,txt)发给我们,让我们自行导入数据库。同时我们希望所有开发及测试环境的数据都以该数据为准,而不是一些填充的假数据。可能有如下方法:
- 根据文案,手动编写 Seed 文件;
- 编写脚本,读取准备好的文件,将数据插入数据库;
- 在某个测试环境的管理后台,或者数据库中,将内容编辑好,然后将数据导出,通过脚本或者手动导入的方式统一他人环境。
orangehill/iseed
则是将上述的第三种方法变得更加方便和可控。
安装
orangehill/iseed
的功能是辅助开发人员生成 Seed,所以我们应该将它安装在开发环境:
$ composer require orangehill/iseed --dev
使用
结合 LaraBBS 的场景,在主页的右下角会有 资源推荐
的版块,其中的数据是我们通过 faker
生成的测试数据,数据其实很简单,只有标题和链接。
看一下数据库中的结构:
如果我们精心整理好了标题和链接,希望以后开发和测试环境中的数据都固定下来,而不是随机生成的,那么可以直接通过 orangehill/iseed
将数据库中准备好的数据导出为 Seed 文件。
使用 php artisan iseed table_name
即可导出对应的表,这里我们导出 links
表。
$ php artisan iseed links
运行时会提示我们 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
参数意思是强制覆盖已存在的 Seed 文件,最多导出 5 条,不包含 created_at
和 updated_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'