Laravel 1対多のモデルを構築する[belongsTo]

2020年2月25日

PHP

「1対多」のリレーションを持つモデルを構築し、簡単なアプリケーションを作成します。

 

 

本記事では下記イラストのような関係を持つ2つのモデルを用意します。Clubが親でMemberが子の関係となります。

 

 

 

 

また上記の2つのモデルを元に、アプリケーションを作成します。メンバー一覧画面・新規追加画面・編集画面を実装します。一覧画面および新規作成画面(セレクトボックス)において2つのモデルを組み合わせて表示させていることが確認できます。なお本記事ではバリデーションは実装していません。

 

 

CRUD機能実装の説明およびバリデーションについては下記ページもご覧下さい。

 

CRUDを実装する

 

 

 

モデルの作成


 

まずモデルとマイグレーションファイルを作成します。

 

 

app/Member.php

17行目

子のMemberから親のClubへアクセスできるようになります。Eloquentはリレーションの外部キーが規約通りに記述されている場合、自動で認識してくれます。本記事ではMemberモデルのclub_idが外部キーとして認識されます(つまりMemberモデルにカラム名としてclub_idを記述しておく必要があります→後述)。Laravel 6.x Eloquent:リレーション」を参照

 

もしMemberモデルにおける外部キーとして、規約としてのclub_idではないhoge_idのようなカラム名を利用する場合は、第2引数にそのカラム名、第3引数に親のモデルの主キー(本記事ではclubsテーブルのid)を指定します。

 

 

app/Club.php

 

 

database/migrations/ディレクトリ以下に2つのファイルが生成されるので編集します。

 

2020_02_25_021325_create_members_table.php

20行目

club_idのように「モデル名_id」と記述していることに注意して下さい。

 

 

2020_02_25_021338_create_clubs_table.php

 

 

マイグレーションを実行します。

 

完了するとmembersテーブルとclubsテーブルが生成されているのが確認できます。

 

 

clubsテーブルに適当なデータを登録しておいて下さい。

 

 

コントローラーの作成


 

次に–resourceを付けてコントローラーファイルを作成します。

 

web.phpに下記コードを追記します。

routes/web.php

 

設定されているルート情報を確認します。

 

–resourceを付けることにより作成したコントローラーファイルに各アクションである index() / create() / store() / show() / edit() / update() / destroy() があらかじめ記述されているのが確認できます。今回は一覧・新規作成・編集のみの機能を実装するので下記のように追記します(ハイライト部分)。

 

app/Http/Controllers/MemberController.php

 

 

ビューの作成


 

メンバー一覧画面

resources/views/member/index.blade.php

 

 

メンバー新規作成画面

resources/views/member/create.blade.php

 

 

メンバー編集画面

resources/views/member/edit.blade.php

 

 

 

参照ページ


 

Laravel 6.x Eloquent:リレーション

 

 

 

LINEで送る
Pocket

定番本
定期本
 
Copyright © 2020 思考の葉 All Rights Reserved.  プライバシーポリシー