[Larevel] Seederをより使いやすくする

LaravelではSeederを利用したデータの登録が用意されており、これをより使いやすくインタラクティブにする方法がとても良かったので紹介します。

ユーザーには3つの権限administratorwriterreaderのいずれかに属するものとし、これをSeeder実行時に指定するサンプルです。

migrationの編集

Laravelインストール時に用意されているdatabases/migrations/2014_10_12_000000_ceate_users_table.phpを編集して利用します。

下記のように権限に関するroleカラムを追加してください。

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->enum('role', ['administrator', 'writer', 'reader'])->default('reader');
        $table->rememberToken();
        $table->timestamps();
    });
}

編集後にphp artisan migratoinコマンドでマイグレーションを実行しておきましょう。

Userモデルの編集

作成したroleカラムに関する処理を追加します。

// app/User.php

public function withRole($role)
{
    $this->role = $role;
    $this->save();

    return $this;
}

Seederの作成

今回の肝の部分ですが、実行するSeederを作成しておきます。

php artisan make:seeder UserSeeder
Seeder created successfully.

作成したSeederを下記のように編集します。

<?php

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(\App\User::class)
            ->create()
            ->withRole($this->command->choice(
                'What role is the user?', [
                    'administrator',
                    'writer',
                    'reader'
                ]
            ));
    }
}

コマンドクラスのchoiceメソッドを利用して、withRole()メソッドへ渡す引数の指定を可変に出来ます。

Seederコマンドを実行して動作を確認してみましょう。

php artisan db:seed --class=UserSeeder

 What role is the user?:
  [0] administrator
  [1] writer
  [2] reader

コンソール上に権限を指定するインターフェイスが表示されました。各種数字を入力することで、簡単に権限の付与が可能になります。


Caleb Porzioさんのツイート: "🌱💧 Pro Tip: make your database seeders more user-friendly and interactive with Laravel's command interface 💧🌱 ... endless possibilities… https://t.co/MYD6EGmYAk"

© Xzxzyzyz