はじめに
結論から言うと、orangehill/iseedを使えば、逆生成できます。
逆生成したくなった背景は下記のとおり。
-
Laravel5.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をモックせずに、機能テストを書くようにしましょう。
ではでは。