62
61

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

62
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
62
61

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?