PHP
Laravel

データベースからLaravelのSeederを逆生成する

More than 1 year has passed since last update.


はじめに

結論から言うと、orangehill/iseedを使えば、逆生成できます。

逆生成したくなった背景は下記のとおり。



  • Laravel 5.4で書かれたAPI

  • データベースを使った機能テストを書きたい

  • マイグレーションはある


  • Seederは使っていない

  • いわゆるマスターデータ(最初から投入されているデータ)が必要

  • CI環境(など使い捨ての環境)でテストを自動実行したい


導入手順

READMEを読めば分かることですが、やったことを列挙します。



  • composer require --dev "orangehill/iseed"


    • 開発者しか使わない機能なので、--devでインストール




  • config/app.phpprovidersOrangehill\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をモックせずに、機能テストを書くようにしましょう。

ではでは。