Laravel 多対多(Many to Many)アプリの構築

2020年11月5日

PHP

Laravel(バージョン8.0.4を利用)において、「多対多(Many to Many)」のリレーションを持つモデルを構築し、簡単なアプリケーションを作成します。

 

本記事では下記のような関係を持つbooks/tags/book_tagの3つのテーブルを作成します。booksとtagsは多対多の関係であり、book_tagテーブルは中間テーブルとなります。

 

 

作成するアプリケーションは、Book一覧画面・新規作成画面・編集画面、また任意のタグが付けられたBookの一覧画面を実装します。なお本記事ではバリデーションは実装していません。

 

 

1. Book一覧の画面です。 2. あらかじめtagsテーブルには喜び/悲しみ/笑いを登録してあり、チェックボックスとしてタグ付けします。 3. 新規登録すると一覧画面に戻り、登録完了のメッセージが表示されます。 4. 編集画面で「編集する」ボタンをクリックすると、編集完了のメッセージが表示されます(5)。 6. すでに2冊登録してある様子です。「笑い」タグをクリックすると紐付けられたBookの一覧(7)が表示されます。今回は単純に登録されたタグのidを/tag/3のようにURLとして利用します。

 

 

テーブルの作成


 

まずBookとTagのモデルとマイグレーションファイルを作成し、下記のように編集します。

 

 

app/Models/Book.php (Laravel 8.xではModelsディレクトリが生成されます。)

18行目 belongsToManyメソッドで多対多として関連付けしています。withTimestampsメソッドで中間テーブルのタイムスタンプを更新します。

 

app/Models/Tag.php

 

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

 

2020_11_02_055438_create_books_table.php

 

2020_11_02_055457_create_tags_table.php

 

 

次に中間テーブルのマイグレーションファイルを作成します(モデルの作成は不要)。

規約通りに作成するならば、中間テーブルの名前は関係するモデル名(bookとtag)をアルファベット順に並べた「book_tag」となります。もし別のテーブル名にするならば、上述したbelongsToManyメソッドの第2引数に設定します。

 

2020_11_02_060213_create_book_tag_table.php

20/21行目 外部キー制約を設定しています。

 

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

 

今回はTag自体のCRUD機能は作成しませんので、生成されたtagsテーブルに適当なデータを登録しておいて下さい。

 

 

コントローラーの作成


 

次に–resourceを付けてコントローラーファイルを作成します。TagControllerは上述した画面遷移図の7で利用します。

 

web.phpに下記コードを追記し、ルーティングの設定をおこないます。

routes/web.php(Laravel 8.x ~での記述に注意)

 

設定されているルート情報を確認します。今回利用するルートをハイライトしています。

 

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

 

app/Http/Controllers/BookController.php

43行目 attachメソッドを利用して、中間テーブルにデータを追加しています。

86行目 syncメソッドを利用して、中間テーブルの更新をおこなっています。

100行目 detachメソッドを利用すると中間テーブルから関連するデータも削除されます。ただし、マイグレーションファイルにて外部キー制約を設定しているため、ここではdetachメソッドがなくても削除されます。

 

app/Http/Controllers/TagController.php

 

 

ビューの作成


 

resources/views以下にbookおよびtagディレクトリを用意し、下記のようにファイルを作成します。

 

Book一覧画面

resources/views/book/index.blade.php

 

Book新規作成画面

resources/views/book/create.blade.php

 

編集画面

resources/views/book/edit.blade.php

 

〜タグBook一覧画面

resources/views/tag/show.blade.php

 

 

関連ページ

1対多のモデルを構築する

 

 

参照ページ


 

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

多対多

 

 

LINEで送る
Pocket

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