60
70

More than 3 years have passed since last update.

Laravel5.7でSeederとかFactoryとか

Last updated at Posted at 2018-10-07

しばらくブランクがあったのでまとめ直し。

SeederとFactory

Seederはデータベースにデータを(一括)挿入する仕組み。
FactoryはSeederにデータを与える仕組み(通常、Seederの中で呼び出す)。

両者とも便利であることはもちろん、データ生成をプログラムとして定義することで再現性、バージョン管理等が可能としている。

誤解を恐れず言えば、Factoryは必須ではない(Seeder内のプログラムで代用可能)。

利用してみる

Seederファイルの作成

下記のコマンドを実行するとdatabase/seeds/以下にファイルが生成される。

php artisan make:seeder UsersTableSeeder

Seederの登録

生成されたファイルはそのままでは利用できない(db:seedで生成されない)。
db:seedで生成対象とするためにはDatabaseSeeder.phpで登録を行う。

database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        //コメントイン
        $this->call(UsersTableSeeder::class);
        //必要に応じて他のSeederファイルを追加
        //$this->call(AdminTableSeeder::class);
    }
}

Seederファイルの編集

run()メソッドに必要な処理を実装する。
Factoryが複数件のダミーデータを生成する用に存在することを考えれば、Seeder自体ではテーブルに存在してほしいユーザーや情報を明示的に指定するのが妥当でしょうかね。

ここではtest1ユーザーを指定した名前、email、パスワードで生成している。

Factoryを利用せずともfor等でループしてもよい。

まあ「絶対こうしろ」というものがわるわけではない。

database/seeds/UsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use App\User;
use Faker\Factory as Faker;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        //一括削除
        User::truncate();

        //特定のデータを追加
        User::create([
            'name' => 'test1',
            'email' => 'test1@test.com',
            'password' => Hash::make('testtest')
        ]);

        //必要ならfaker利用
        $faker = Faker::create('en_US');
        // $faker = Faker::create('ja_JP');

        //必要ならループ(ここをFactory使う)
        for($i = 0; $i < 10; $i++){
            User::create([
                'name' => $faker->name,
                'email' => $faker->email,
                'password' => Hash::make('testtest')
            ]);
        }

        //factoryを利用(結果は上記と同じ)
        factory(User::class, 10)->create();
    }
}

Factoryはmake:factoryで生成できる。UserFactoryは既にあるので、今回はそれをそのまま利用。

php artisan make:factory UserFactory
Factory already exists!

ファクトリーファイルの中身は下記のような感じ。Fakerが使われている。もちろん必須ではない。

database/factories/UserFactory.php
<?php

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => Hash::make('testtest'), //使えるパスワードにしておく
        'remember_token' => str_random(10),
    ];
});

Seederの実行。

php artisan db:seed

下記のような感じで生成された(テーブルを一部抜粋)。
test1ユーザーは明示的に生成。
次の10件はforでループ。
次の10件はFactoryで生成されたもの。

+----+-----------------------+-------------------------------+-----------+----------------+
| id | name                  | email                         | password  | remember_token |
+----+-----------------------+-------------------------------+-----------+----------------+
|  1 | test1                 | test1@test.com                | $2y$10$zU | NULL           |
|  2 | Dr. Dejah Kuhlman Sr. | ebony39@hotmail.com           | $2y$10$6N | NULL           |
|  3 | Valentina Crist       | gibson.lillie@macejkovic.com  | $2y$10$zN | NULL           |
|  4 | Prof. Colton Haley V  | fredrick.mertz@kozey.com      | $2y$10$No | NULL           |
|  5 | Robin Schmitt         | blaze.johnston@gmail.com      | $2y$10$0M | NULL           |
|  6 | Berniece Bergstrom    | kreiger.kenny@greenfelder.com | $2y$10$XB | NULL           |
|  7 | Tyrel Hirthe          | lilly60@volkman.com           | $2y$10$Iw | NULL           |
|  8 | Cyrus Upton           | whoeger@hotmail.com           | $2y$10$O2 | NULL           |
|  9 | Prof. Mateo Hahn DVM  | jazlyn.schuster@emmerich.com  | $2y$10$J9 | NULL           |
| 10 | Janick Kulas          | lueilwitz.martina@hotmail.com | $2y$10$HT | NULL           |
| 11 | Ward Thiel            | tyra90@cummings.info          | $2y$10$Rt | NULL           |
| 12 | Eulalia Skiles        | vada.fay@example.org          | $2y$10$5g | 8QV0ucwmVZ     |
| 13 | Adolf Bogisich        | srempel@example.net           | $2y$10$4Y | JMv4lcCqeQ     |
| 14 | Monserrat Ernser MD   | woberbrunner@example.net      | $2y$10$bp | ZfuH7DLwyU     |
| 15 | Rahsaan Brown PhD     | dusty79@example.net           | $2y$10$/D | iPx5Tely3r     |
| 16 | Kris Collins          | xkuhn@example.org             | $2y$10$T/ | LnldjSrwLh     |
| 17 | Briana Kulas          | ben36@example.com             | $2y$10$CM | cyrmdEvGYh     |
| 18 | Dr. Everett Spencer   | ztorphy@example.com           | $2y$10$C. | e95b17WjU1     |
| 19 | Elyse Waters          | frederic.bode@example.com     | $2y$10$TZ | UbfcXQ6Mex     |
| 20 | Ali Fahey Jr.         | jazlyn.schulist@example.org   | $2y$10$RV | EWOsNNcdHJ     |
| 21 | Mrs. Madge Macejkovic | shania99@example.com          | $2y$10$iW | ELz6HVvDKh     |
+----+-----------------------+-------------------------------+-----------+----------------+

Faker自体の使い方はこちらを参考にどうぞ。

60
70
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
60
70