Laravel

【Laravel】掲示板を作成する(2)Eloquentでのリレーション設定、SeedとFakerでDBにテストデータを登録

Laravelによる掲示板の作成、第2回です。
今回は「Eloquent機能を使ってのリレーションの設定」と、「Seed機能とFakerを用いてのテストデータの登録」についてポストしたいと思います。

3.Eloquent機能を使いモデルのリレーションを設定する

モデルの作成

Post、Comment、Category の3つのモデルファイルを作成します。
まずはPostモデル。下記のコマンドで、app直下へPostモデルファイルが作成されます。

続けて「Comment」と「Category」モデルを作成します。

Postモデルを編集

コメントテーブルとカテゴリーテーブルに対するリレーションを設定します。
ポストテーブルから見てコメントテーブルへは「1対多」なので、「hasMany」を、ポストテーブルから見てカテゴリーテーブルへは「所属元」ということで「belongsTo」を設定します。
Commentsメソッドが複数形で、Categoryメソッドが単数形なのは、hasManyの場合は複数形にするのが決まりのようです。

編集ファイル:app\Post.php

Commentモデルを編集

コメントテーブルから見てポストテーブルは「所属元」なので、「belongsTo」を設定します。

編集ファイル:app\Comment.php

Categoryモデルを編集

カテゴリーテーブルから見てポストテーブルは「1対多」なので、「hasMany」を設定します。

編集ファイル:app\Category.php

モデルのリレーションに関してはCakePHPとほぼ同じ考えなので、特に苦しむことなく理解できました。
ということは多対多になると急にややこしくなるって事ですね(笑)

4.LaravelのSeed機能とFakerを使ってDBにテストデータを登録する

ファクトリファイルの作成

開発しやすくるため、テストデータを50件程度作成します。
下記のコマンドを実行して「ファクトリ」ファイルを作成します。

PostFactory作成

CommentFactory, CategoryFactory

同様にコメント用とカテゴリ用のファクトリファイルも作成します。

/database/factories/ に、PostFactory.php, CommentFactory.php, CategoryFactory.php が作成されます。

ファクトリファイルの編集

SeederでFactoryを使用すると、複数データを用意する場合にfor文を書かなくていいので簡潔にコードが書け、リレーションがあっても簡潔に書けるとのことなので、Laravelの流儀を理解する意味も込めてFactoryとSeederを使ってみたいと思います。

FactoryとSeederについての公式ドキュメントはこちら。

あと、それっぽい疑似フェイクデータを自動生成してくれる便利なライブラリ「Faker」を使用してデータを作成します。
Laravelは同梱してインストールしてくれているようなので、特に意識せずに使用できたりします。

まずは下準備として、config\app.php の faker_locake を「en_US」から「ja_JP」に変更します。
これで生まれるテストデータが日本語になってくれます。これ、地味にものすごく便利でした。

Fakerの使い方についてはこちらを参照。

PostFactory.phpを編集

編集ファイル:database\factories\PostFactory.php

CommentFactory.phpを編集

編集ファイル:database\factories\CommentFactory.php

Category

カテゴリーは(ちょっと手を抜いて?)SQLを使って作成しておくことにします。
ポストテーブルへのFakerの設定でcategory_idを1〜5の整数にしているのは、ここで5このレコードを作成するからです。

Seederを作成する

下記コマンドを実行し、Seederファイルを作成します。

成功すると database/seedsPostsTableSeeder.php が作成されるので編集します。
内容は50件の投稿を作成して、各投稿に2つのコメントを作成する内容です。

編集ファイル:database\seeds\PostsTableSeeder.php

50回の each() というループの中でコメント作成を2回行っているので、投稿レコード50件、コメントレコードは各投稿につき2回作成しているので合計100件が生成される予定です。

最後に、database/seeds/DatabaseSeeder.phpを開いて、runメソッドに PostsTableSeeder を追加します。

ここまで出来上がったら、下記のコマンドを実行してテストデータをデータベースに投入します。
通常コマンドの実行でいけます。

postsテーブル(50件)

きっちり50件出来上がっていました。
日本語の場合のテキストは、「銀河鉄道の夜」の文章を切り貼りしているようです。日付は完全ランダムです。名前ライブラリ内にある名字と名前を組み合わせて出力しているのでしょう。割とレアある私の名字は見た感じなかったのが残念(笑)

commentsテーブル(100件)

こちらも50x2の100件が生成されています。外部キーのpost_idもちゃんと登録されており、理想通りのリレーションレコードとなっていました。

第2回はここまでとします。
次回は一覧画面の制作に取り掛かります。

-Laravel
-, , ,