PHP
laravel

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

はじめに

結論から言うと、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をモックせずに、機能テストを書くようにしましょう。
ではでは。