初めてのLaravel 5.6 : (13) Seeding と Factory

Laravel では artisan db:seed コマンドを使って、初期データを DB に埋め込むことが可能です。システムに必要な初期データを作成したり、開発で使用するサンプルデータを作成することができます。今回は Articles テーブルに開発で使用するサンプルデータを作成してみます。

Seeder ファイル作成

まずは artisan コマンドで Seeder ファイルを作成します。

php artisan make:seeder ArticlesTableSeeder

Seeder ファイルは database/seeds ディレクトリ以下に作成されます。
デフォルトで DatabaseSeeder.php ファイルが既に存在しています。

database
└── seeds
    ├── ArticlesTableSeeder.php
    └── DatabaseSeeder.php

DatabaseSeeder.php

DatabaseSeeder.php を以下のように修正します。

<?php // database/seeds/DatabaseSeeder.php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            ArticlesTableSeeder::class, // ①
            // OtherTableSeeder::class, // ②
        ]);
    }
}

① ArticlesTableSeeder の呼び出しを追加します。
② 複数の Seeder を呼び出したい場合はここに追加します。

ArticlesTableSeeder.php

ArticlesTableSeeder.php を以下のように修正します。

<?php // database/seeds/ArticlesTableSeeder.php

use Illuminate\Database\Seeder;

use Illuminate\Support\Facades\DB;
use Faker\Factory as Faker;
use Carbon\Carbon;
use App\Article;

class ArticlesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('articles')->delete(); // ①

        $faker = Faker::create('en_US'); // ②

        for ($i = 0; $i < 10; $i++) {    // ③
            Article::create([
                'title' => $faker->sentence(),
                'body' => $faker->paragraph(),
                'published_at' => Carbon::today()
            ]);
        }
    }
}

Query Builder を使って、Articlesテーブルのレコードを全て削除します。
Faker を使用してダミーデータを作成しています。Laravel では標準で Faker が使用できるようになっています。
③ 10件の Article データを作成します。

ちなみに、Seeding 中はマスアサインメントのフィールド保護は無効化されます。

Seed を実行

php artisan db:seed
Seeded: ArticlesTableSeeder

tinker を使って、結果を確認します。

$ php artisan tinker
>>> App\Article::all()->toArray();
=> [
       [
           "id"           => "1",
           "title"        => "Voluptates repellendus libero quia provident officiis laudantium nesciunt.",
           "body"         => "Ut ab non dolor et nulla mollitia illo. Est quidem saepe adipisci magni unde pariatur animi. Porro vel laboriosam excepturi excepturi dolores. Non doloremque sapiente aut id.",
           "created_at"   => "2015-02-24 17:35:48",
           "updated_at"   => "2015-02-24 17:35:48",
           "published_at" => "2015-02-24 17:35:48"
       ],
...

データが登録できました。


Factory

Seeder の中で、Articles テーブルにダミーのデータを作成している部分を Laravel の Factory 機能を使って書き換えてみます。

まずは Factory ファイルを作成します。

php artisan make:factory ArticleFactory

Factory ファイルは database/factories ディレクトリ以下に作成されます。
デフォルトで UserFactory.php ファイルが既に存在しています。

database
└── factories
    ├── ArticleFactory.php
    └── UserFactory.php

ArticleFactory.php

ArticleFactory.php を以下のように修正します。

<?php // database/factories/ArticleFactory.php

use Faker\Generator as Faker;
use Carbon\Carbon;

$factory->define(App\Article::class, function (Faker $faker) { // ①
    return [ // ②
        'title' => $faker->sentence(),
        'body' => $faker->paragraph(),
        'published_at' => Carbon::today(),
    ];
});

① Model::class になっていたところを App\Article::class に変更します
② 設定する項目と内容を定義します。Faker を使ってダミーデータを作成します。

ArticlesTableSeeder.php

ArticlesTableSeeder.php を factory() 関数を使用するように修正します。

<?php // database/seeds/ArticlesTableSeeder.php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class ArticlesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('articles')->delete();

        factory(App\Article::class, 20)->create(); // ①
    }
}

① factory() 関数に作成するモデルのクラス名と件数を指定して、DBにデータを作成します。

Seed を実行

php artisan db:seed
Seeded: ArticlesTableSeeder

tinker を使って、結果を確認します。

php artisan tinker

>>> App\Article::count()
=> 20
>>> 

20件のデータが登録できています。


tinker で factory を使ってみる

factory は tinker から実行することもできます。factory さえ定義しておけば、ダミーデータをいつでも簡単に生成できます。

php artisan tinker

>>> App\Article::count()
=> 20
>>> DB::table('articles')->delete()
=> 20
>>> App\Article::count()
=> 0

>>> $articles = factory(App\Article::class, 2)->make()
=> Illuminate\Database\Eloquent\Collection {#2893
     all: [
       App\Article {#2889
         title: "Explicabo rem incidunt laborum laudantium adipisci dicta odit.",
         body: "Blanditiis voluptas est explicabo. Quod necessitatibus laboriosam modi vel ea. Voluptatum iusto quam et perferendis beatae commodi delectus.",
         published_at: "2018-08-25 00:00:00",
       },
       ...
     ],
   }
>>> App\Article::count()
=> 0
>>> $articles->count()
=> 2

>>> $articles = factory(App\Article::class, 3)->create()
=> Illuminate\Database\Eloquent\Collection {#2886
     all: [
       App\Article {#2874
         title: "Et vel id cumque et sed dolores.",
         body: "Et facilis ea in dolorum est et consequatur dolorum. Nostrum sit sed dicta doloremque optio et perspiciatis. Ut corporis quo esse sapiente minus voluptates. Asperiores mollitia sed voluptas esse facere rerum.",
         published_at: "2018-08-25 00:00:00",
         updated_at: "2018-08-25 20:39:51",
         created_at: "2018-08-25 20:39:51",
         id: 87,
       },
       ...
     ],
   }
>>> App\Article::count()
=> 3
>>> $articles->count()
=> 3
>>> 

最初に DB 内の Articles テーブルのデータ件数を確認した後、一旦削除しています。

次に、factory(…)->make() を使っています。DB のデータ件数は増えていませんが、make() 関数の返り値でセットされた $articles の件数は2件になっています。

最後に、factory(…)->create() を使っています。DB のデータ件数も増えていますし、$articles の件数も3件です。

make() と create() の違いは分かりましたでしょうか? create() の方は DB 内にデータを作成します。make() の方は生成したデータを返すでけで、DB の方は何もしません。

一時的なテスト用データを作成するだけでしたら、Seeder を使うまでもなく、tinker と factory を使うべきでしょう。

Seeder はシステムに必要な初期データの生成に使って、テストデータは factory を使うように住み分けるのがよさそうです。


まとめ

以下のことができるようになりました。

  • Seeder を使った DB へのデータ作成
  • Factory を使ったテスト用データの作成
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中