1
1

More than 3 years have passed since last update.

laravel5.5 シーダーファイルについてまとめる

Posted at

シーダとは

データベースのテーブルにダミーのレコードを準備する機能
「シーディング」と呼ばれる。これは、シード(最初から用意しておくレコード)を生成する機能

主な手順は3つ
①シーディングのためのシーダーファイルを生成する。
②シーディングファイルを編集してシードを追加していく
③コマンドでシーディングを実行する

シーディングのためのシーダファイルの生成方法

Laravelのappアプリ名ディレクトリ直下で以下のコマンドを実行

php artisan make:seeder ファイル名(例 UserTableSeeder)

database/seedsにファイルが生成されているため編集

database/seeds/UserTableSeeder
DB::table('employees')->insert([
        [
            'name' => 'テストユーザー1',
            'email' => 'test1@example.com',
            'password => Hash::make('password'),
         ],
        [
            'name' => 'テストユーザー2',
            'email' => 'test2@example.com',
            'password => Hash::make('password'),
        ],
        [
            'name' => 'テストユーザー3',
            'email' => 'test3@example.com',
            'password => Hash::make('password'),
        ],

変数にして導入することも可能

database/seeds/UserTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $param =[
            'name' => 'テストユーザー1',
            'email' => 'test1@example.com',
            'password => Hash::make('password'),
        ];

        DB::table('admins')->insert($param);
    }
}

ポイント
パスワードをデータベースに格納する場合はハッシュ化して格納しましょう
'password' => Hash::make('password');
Hash::makeとは

シーダファイルの登録

作成したシーダファイルが実行されるように、デフォルトで用意されているDatabaseSeederに登録する必要がある。

$this->call(シーダクラス::class);

デフォルトのDatabaseSeederに記述を追加していきます。
例えば、UserTableSeederクラスとAdminTableSeederクラスを実行する場合は下記のように記述します。

database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserTableSeeder::class);
        $this->call(AdminTableSeeder::class);
    }
}

実行するシーダークラスのclassをプロパティを引数にして[call]というメソッドを呼び出します。これはSeederクラスにあるメソッドで、これにより指定したクラスのrunメソッドが呼び出され、シーディング処理されるようになります。

シーディングを実行する

以下のコマンドを実行してDatabaseSeederのrunが実行され、そこから各シーダーファイルのrunが呼び出されて実行されます。結果、データベースに格納されているはずです。

php artisan db:seed

個別のseederクラスのみ実行する場合はコマンドでクラスを指定する

php artisan db:seed --class=UsersTableSeeder

シーディングした内容を戻す方法
以下のコマンドを叩く事でロールバック(定義したテーブル全削除)→テーブル再構築→シーディング実行(初期データ投入)までを1つのコマンドで行えます。

php artisan migrate:refresh --seed

大量のデータを格納する場合は、フェイカーとモデルファクトリの利用

もちろんそれぞれのモデルシーダで属性をいちいち指定するのは面倒です。代わりに大量のデータベースレコードを生成するのに便利なモデルファクトリが使用できます。ァクトリが定義できれば、データベースにレコードを挿入するfactoryヘルパ関数が利用できます。

ファクトリーファイルの中でフェイカー使って ダミーデータを作成します。

例として50件のレコードを生成し、それぞれのユーザーへリレーションを付加してみましょう。

php artisan make:factory BookFactory
?php

use Faker\Generator as Faker;

$factory->define(App\Book::class, function (Faker $faker) {
    $now = \Carbon\Carbon::now();
    return [
        'isbn' => $faker->isbn13,
        'published_date' => $faker->date($format = 'Y-m-d', $max = 'now'),
        'price' => $faker->randomNumber(4),
        'created_at' =>$now,
        'updated_at' => $now
    ];
});

シーダーファイルにファクトリの内容を追記

<?php

use IlluminateDatabaseSeeder;

class BooksTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
    //
    factory(AppBooks::class, 50)->create(); //50個のダミーデータを生成
    }
}

参考にしたサイト
https://coinbaby8.com/laravel-seeder-factory-faker.html
https://qiita.com/tosite0345/items/1d47961947a6770053af
https://laraweb.net/knowledge/2302/

1
1
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
1
1