Laravelでリレーションを使ったコメント機能とコメント数の表示
2924 回閲覧されました
みなさんこんにちは、jonioです。
今回はLaravelでリレーションを使って投稿にコメントする方法と投稿を削除した時にコメントも削除する方法とコメントがある場合にコメント数を表示する方法の解説をします。
今回解説する際のコントローラーやビューのコードですがコメントの機能に関係ない部分もありますがそれに関しては触れないので無視してコードを見て下さい。
今回の記事を読むに当たって知ってないといけない知識と実装しておかないといけない内容があるのでまずはそれの説明からします。
目次
前提条件(リレーション)
あるテーブルから別のテーブルの情報を引っ張って来る時にリレーションというのを使います。
今回は1対多リレーションを使いますがリレーションを知らないと今回の解説は理解できません。
リレーションを知らない方はまず1対1リレーションが何かを知りましょう。
これが理解できたら1対多リレーションを知りましょう、1対1リレーションが理解できたら難しくないと思います。
前提条件(投稿の実装)
コメント機能は投稿に対して行うので先に投稿を実装しないといけませんがコードに関して説明しないので自分で理解して下さい。
テーブルの作成
投稿内容を保存するpostsテーブルを作成します。
ターミナルで↓のコマンドを叩きます。
そしてカラムの追加をします。
カラムの追加
マイグレーションファイルに↓の記述をします。
できたら「php artisan migrate」をするとpostsテーブルにカラムが追加されます。
モデルの設定
テーブルのカラムに情報を追加するのを許可する設定をします。
Post.phpに↓の記述をします。
usersテーブルに関してはログイン機能を実装すれば作成されるのでBreezeなどでログイン機能を実装してusersテーブルを作成して下さい。
ここまででテーブルの設定が終わりました。
次は投稿内容を実装する為のルーティング→コントローラー→ビューと見ていきます。
ルーティング
web.phpを↓にします。
コントローラーに「PostController」を使っているのでPostControllerの作成をしますが記述を楽にする為にリソースコントローラーを使用します。
コントローラー
ターミナルで↓のコマンドを叩きます。
PostController.phpに投稿ページの表示(createアクション)と投稿内容を保存(storeアクション)できる様にする為のコードを書きます。
次は投稿ページのビューです。
ビュー
ビューはcreate.blade.phpとしてコードを↓にします。
ページを開くと↓になるはずです。(サイドバーは無視して下さい)
これで「送信する」を押すと投稿内容をpostsテーブルに保存できる様になりました。
次は投稿内容一覧を表示して投稿内容の中身を表示する為の記述をします。
投稿一覧の表示はLaravelのプロジェクトを作成した時点で存在するHomeControllerを使います。
ルーティング
web.phpに↓を追加します。(追加する前から存在しているはずです)
コントローラー
indexアクションを↓にします。
ビュー
home.blade.phpを↓にします。
これで↓の表示になります。
次は投稿の中身の表示をします。
PostControllerを使いますがリソースコントローラーなのでルーティングは必要ありません。
コントローラー
showアクションを↓にします。
次はビューです。
ビュー
show.blade.phpを↓にします。
ここまでが前提になります。
それではコメント機能の実装をしていきます。
リレーションの関係図
投稿テーブル(posts)とユーザーテーブル(users)が紐づいているとします。
この時のPostモデルとUserモデルは↓になっています。
1人のユーザーに対して複数の投稿があるかもしれないので1対多リレーション(親テーブルはusers)を使っています。
ER図は↓です。(IE記法で描いてます)
コメントする時のテーブルの関係
ユーザーが複数のコメントをする可能性があるのと1つの投稿に対して複数のコメントがあるかもしれません。
だからユーザー・コメント間で1対多リレーション(親テーブルはusers)をして投稿・コメント間で1対多リレーション(親テーブルはposts)をします。
ER図は↓です。
Userモデル・Postモデル・Commentモデルは↓になります。(Commentモデルは後で作成します)
commentsテーブルの作成
まずはcommentsテーブルの作成をしますが↓のコマンドを叩きます。
commentsテーブルにカラムを追加する為にマイグレーションファイルに 記述します。
そして↓のコマンドを叩きます。
これでテーブルが↓になります。
fillableの設定
Comment.phpに↓の記述をします。
20行目〜28行目は「コメントする時のテーブルの関係」の項目で「Commentテーブルは後で作成します」と説明した部分です。
それではコメント機能を作っていきます。
ルーティング
web.phpに↓のコードを追加します。
コントローラー
CommentControllerを作成します。
ターミナルで↓のコマンドを叩きます。
そして↓の記述をします。
6行目はCommentモデルに情報を保存できる様にする為にあります。
15行目〜17行目はバリデーションです、コメントの文字数を最大255字に制限しています。
19行目〜23行目はコメントの内容を保存します。
20行目の「body」はコメントの内容で21行目の「user_id」はusersテーブルのログインユーザーのidに対応してい22行目の「post_id」はpostsテーブルの投稿のidに対応しています。
user_idとpost_idに関して説明します。
「user_id」がある理由ですがコメントをするユーザーを表示する為です。
具体的に見ます。
↓はcommentsテーブルですがuser_id=1があります。
リレーションを使った時にusersテーブルのid=1が対応します。
そしてビューで「{{$comment->user->name}}」と書くとcommentsテーブルのuser_id=1に対応したusersテーブルのid=1のnameカラムの値(今だとjonio)が表示されます。
「post_id」がある理由はビュー(show.blade.phpです)のコメントをするフォームにname=”post_id”があるのですがそれに対応させてどの投稿にコメントするかを指定する為です。
↑ですがshow.blade.phpの62行目〜72行目です。
これでコメントするのは完成ですが問題があります。
投稿を削除した時に投稿を表示するのに必要なpostsテーブルの中にある投稿の情報は削除されますがそれに紐づいているcommentsテーブルのコメントは削除されません。
だからコメントの削除方法も解説します。
PostController(リソースコントローラー)を使うのでルーティングは必要ないのでコントローラー→ビューと見ていきます。
コメントの削除
コントローラーですがPostController.phpを↓にします。
3行目ですがリレーションを使って投稿に紐づいているコメントを削除します。
4行目で投稿を削除します。
ビューは既に作成したshow.blade.phpの12行目〜16行目です。
これでコメントの削除機能は完成したので次はコメント数の表示です。
コメント数の表示
↓は投稿一覧のページですがコメントがない時は「コメントはまだありません」(赤枠)と表示されてコメントがある時は「返信〜件」(青枠)と表示されるのが自然なのでそうします。
返信数の表示はhome.blade.phpの29行目〜37行目です。
30行目の「$post->comments->count()」は「コメントがある場合」という意味です。
30行目〜34行目がコメントがある場合で32行目の「{{$post->comments->count()}}」でコメント数を表示しています。
35行目はコメントがない場合です。
これでコメント数を表示するのが実装できました。
Eagerロード
余談ですがリレーションを使う時はEagerロードを使った方がサーバーに負荷がかからないのでおすすめです。
知らない方は↓を読んで下さい。