LaravelでWebアプリケーションを作成する仕事をいただくようになったため、自分への備忘録も兼ねて、初期構築時に必須の【UserとRoleの構築】を紹介します。
マイグレーション作成
まずはLaravelの雛形をダウンロードします。ターミナルから
1 |
composer create-project --prefer-dist laravel/laravel プロジェクト名 |
と入力して、任意のプロジェクト名でLaravelプロジェクトを作成してください。
Laravelの場合、UsersテーブルやUserモデルは最初から生成されているため、RolesテーブルとRoleモデルを作成します。
1 |
php artisan make:model -m Role |
※「-m」はマイグレーションファイルも一緒に作成するためのオプション。
上記コマンドを実行すると、
- Roleモデル
- Rolesテーブル作成用のマイグレーションファイル
が作成されます。
テーブル作成
ここから、実際にファイルを編集して、UsersテーブルとRolesテーブルを作成していきます。
「database/migrations/日付_create_users_table.php」ファイルを以下のように
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * 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->integer('role_id')->index()->unsigned()->nullable(); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } } |
次は、先ほど作成した「database/migrations/日付_create_roles_table.php」ファイルを以下のように
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateRolesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('roles', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('roles'); } } |
編集してください。
これでデータベースにUsersテーブルとRolesテーブルを作成する準備ができました。ターミナルから
1 |
php artisan migrate |
を実行してください。
そうすると、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
mysql> show columns from users; +----------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | password | varchar(255) | NO | | NULL | | | role_id | int(10) unsigned | YES | MUL | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +----------------+------------------+------+-----+---------+----------------+ 8 rows in set (0.00 sec) mysql> show columns from roles; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) |
このような形で、role_idを持つUsersテーブルとRolesテーブルが作成されます。
※うまく作成されない場合は、DBとlaravelが接続されていない可能性があります。「.env」ファイルを編集してください。
リレーションの作成
UsersテーブルとRolesテーブルが作成できたので、2つの関係を定義するリレーションも設定しましょう。
Userは必ず一つのRoleに属します。そのため、UserモデルとRoleモデルのリレーションを設定しなければなりません。
今回はUserがNに対して、Roleが1なので、belongsToの関係をもちます。
1 2 3 |
public function role(){ return $this->belongsTo('App\Role'); } |
laravelのリレーションの記述はシンプルで上記をUser.phpの最後に追加します。
これでUserとRoleの関係を定義することができました。
SeederとFactoryの作成
アプリを作るだけなら、リレーションまで完了すれば十分です。
しかし、何度もデータを整理してアプリを作ったり、複数人でアプリを開発する場合、データベースに初期レコードを設定しておくべきです。
Laravelでデータベースへの初期レコードを設定する場合、SeederとFactoryを使用します。
まずは、Rolesテーブルの初期レコード設定用のSeederを作成するために、
1 |
php artisan make:seeder RolesTableSeeder |
をターミナルから実行してください。
作成された「database/seeds/RolesTableSeeder.php」ファイルを
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php use Illuminate\Database\Seeder; class RolesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('roles')->insert([ [ 'id' => 1, 'name' => 'admin' ], [ 'id' => 2, 'name' => 'subscriber' ] ]); } } |
このように編集します。
これで、Rolesテーブルに
- id: 1, name: admin
- id: 2, name: subscriber
という2つの初期レコードを設定することができるようになりました。
Rolesテーブルへの初期レコード設定が完了したので、最後にUsersテーブルへの初期レコードを設定します。
毎回同じ値を設定するRolesテーブルへの初期レコード設置と異なり、Usersテーブルはランダムにユーザーが登録されるようにします。
また、気をつけなければならない点は、「userは必ず1つのroleをもつということ」
そのため、さきほど設定したRolesテーブルのidをランダムでrole_idに格納しなければなりません。
まずは、Factoryファイルを作成します。ターミナルから
1 |
php artisan make:factory UserFactory |
を実行し、ファイルの中身(database/factories/UserFactory)を
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php use Faker\Generator as Faker; use App\Role; /* |-------------------------------------------------------------------------- | Model Factories |-------------------------------------------------------------------------- | | This directory should contain each of the model factory definitions for | your application. Factories provide a convenient way to generate new | model instances for testing / seeding your application's database. | */ $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => str_random(10), 'role_id' => function() { return Role::all()->random(); } ]; }); |
に変更して下さい。
ここでの実装のポイントは、role_idに対してRole::all()->random()を使って、Roleテーブルが持っているidをランダムに保有させていること。
たったこれだけでRoleとUserを紐づけてダミーユーザーを作成することができます。
最後に、database/seeds/DatabaseSeeder.phpファイルを
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php use Illuminate\Database\Seeder; use App\User; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(RolesTableSeeder::class); factory('App\User', 10)->create(); } } |
このように編集します。これは、RolesTableSeederを実行した後、ランダムユーザーを10人作成する命令を記述しています。
この状態でターミナルから、
1 2 |
php artisan migrate:refresh php artisan db:seed |
を実行すると、
※「php artisan migrate:refresh」はdbを綺麗に作り直している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
mysql> select * from roles; +----+------------+------------+------------+ | id | name | created_at | updated_at | +----+------------+------------+------------+ | 1 | admin | NULL | NULL | | 2 | subscriber | NULL | NULL | +----+------------+------------+------------+ 2 rows in set (0.00 sec) mysql> select * from users; +----+----------------------+----------------------------+--------------------------------------------------------------+---------+----------------+---------------------+---------------------+ | id | name | email | password | role_id | remember_token | created_at | updated_at | +----+----------------------+----------------------------+--------------------------------------------------------------+---------+----------------+---------------------+---------------------+ | 1 | Carey Adams | sid36@example.org | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 1 | r0jQ7QRlRp | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 2 | Conrad Goldner | ryan.corine@example.com | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 1 | 09IhnJhAci | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 3 | Linnie Halvorson III | herta.will@example.net | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 2 | aubNXSBuAo | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 4 | Albina Flatley III | timothy33@example.com | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 1 | L2zAzZAYgi | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 5 | Giles Gutmann | stroman.torrey@example.com | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 2 | VMHFdYhEn6 | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 6 | Breanne Blanda | jdoyle@example.net | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 1 | Vnf1IxDYs1 | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 7 | Eula Casper | price.osinski@example.org | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 2 | psUIqNZ3YM | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 8 | Hadley Block I | parker.sage@example.com | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 2 | lTGzZuTDiq | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 9 | Betsy Hermiston | tomas.nienow@example.org | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 1 | byxZ2wj9q3 | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | | 10 | Greta Hintz MD | qemmerich@example.com | $2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm | 2 | IWVDdwzpI6 | 2018-08-21 16:28:38 | 2018-08-21 16:28:38 | +----+----------------------+----------------------------+--------------------------------------------------------------+---------+----------------+---------------------+---------------------+ 10 rows in set (0.00 sec) |
このような形で、
- 設定した2つのロールが格納されたrolesテーブル
- rolesテーブルのroleをランダムに保有した10件のレコードをもつusersテーブル
が作成されます。
以上でLaravelのUserとRoleの初期構築は完了です。
UserとRoleはアプリケーションを作る上で必ず必要な機能ですので、是非、参考にしてください!