はじめに
結論から言うと、orangehill/iseedを使えば、逆生成できます。
逆生成したくなった背景は下記のとおり。
-
Laravel
5.4で書かれたAPI - データベースを使った機能テストを書きたい
- マイグレーションはある
-
Seeder
は使っていない - いわゆるマスターデータ(最初から投入されているデータ)が必要
- CI環境(など使い捨ての環境)でテストを自動実行したい
導入手順
README
を読めば分かることですが、やったことを列挙します。
-
composer require --dev "orangehill/iseed"
- 開発者しか使わない機能なので、
--dev
でインストール
- 開発者しか使わない機能なので、
-
config/app.php
のproviders
にOrangehill\Iseed\IseedServiceProvider::class
を追加
artisan
コマンド
下記のようにartisan
コマンドを実行すれば、Seeder
クラスが生成されます。
$ php artisan iseed {table_name}
仮に、categories
テーブルだとすると、以下のようになります。
// database/seeds/CategoriesTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class CategoriesTableSeeder extends Seeder
{
/**
* Auto generated seed file
*
* @return void
*/
public function run()
{
\DB::table('categories')->delete();
\DB::table('categories')->insert(array (
0 =>
array (
'id' => 1,
/* ...(中略)... */
),
1 =>
array (
'id' => 2,
/* ...(中略)... */
),
2 =>
外部キーチェックを一時的に無効にする(MySQLの場合)
外部キーがある場合、\DB::table('categories')->delete();
でエラーになったので、\DB::statement('SET FOREIGN_KEY_CHECKS=0');
で外部キーチェックを一時的に無効にし、\DB::statement('SET FOREIGN_KEY_CHECKS=1');
で有効にすることで回避しました。
おわりに
Seeder
がなくても、Migration
がなくても、DBをモックせずに、機能テストを書くようにしましょう。
ではでは。