質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2770閲覧

コメント返信のDB構造と表示方法

baron3

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

3クリップ

投稿2018/11/01 04:58

編集2018/11/01 09:19

環境

Laravel5.5
PHP7.2
MySQL5.7.23

前提・実現したいこと

ひとつの記事に対しコメントをすることが出来、そのコメントに返信が出来るような機能を開発しています。
まさにyoutubeのようなコメント欄を作りたいです。
コメントに返信をすると一段下がったような表示になり、一定数のコメントがたまるとreadmoreが出てくるようなイメージです。

DB構成

** Posts table**
|column|type|key|comment|
|:--|:--:|--:|
|post_id|int|PRIMARY KEY|記事ID
|post_body|text||記事本文
|post_user|string|uuid|ユーザー
|created_at|timestamp||投稿日時

** Comments table**
|column|type|key|comment|
|:--|:--:|--:|
|comment_id|int|RIMARY KEY|コメントID
|comment_body|text||コメント本文
|comment_user|string|uuid|ユーザー
|parent_podt|int|FOREIGN KEY : posts(post_id)|親記事
|parent_comment|int|nullable|親コメント
|created_at|timestamp||投稿日時

記事に対してのコメントだった場合はparent_comment = nullとなります。
逆にコメントに対しての返信だった場合はparent_commentにコメントIDが入ります。

ソースコード

php

1//uuidなどは省略 2$comments[ 3['comment_id'=>1,'comment_body'=>'aaa','parent_post'=>1,'parent_comment'=>null], 4['comment_id'=>2,'comment_body'=>'bbb','parent_post'=>1,'parent_comment'=>null], 5['comment_id'=>3,'comment_body'=>'ccc','parent_post'=>1,'parent_comment'=>1], 6['comment_id'=>4,'comment_body'=>'ddd','parent_post'=>1,'parent_comment'=>1], 7] 8

これを表示しやすいように加工するにはどうしたらいいでしょうか?
$comments->groupBy('parent_comment')を使ってみましたが、Viewでループを何度もまわさないと思ったように表示できませんでした。

php

1$comments=$comments->groupBy('parent_comment'); 2$comments[ 3 "" =>[ 4 ['comment_id'=>1,'comment_body'=>'aaa','parent_post'=>1,'parent_comment'=>null], 5 ['comment_id'=>2,'comment_body'=>'bbb','parent_post'=>1,'parent_comment'=>null], 6 ], 7 1 =>[ 8 ['comment_id'=>3,'comment_body'=>'ccc','parent_post'=>1,'parent_comment'=>1], 9 ['comment_id'=>4,'comment_body'=>'ddd','parent_post'=>1,'parent_comment'=>1], 10 ], 11] 12

あいまいな質問になっていると思いますが、youtubeみたいなのコメント欄をLaravelで作るにはどうしたらいいか教えてください。
よろしくお願いします。

余談

質問とは直接関係がなく申し訳ありませんが、ついでに質問させてください。
DBを作るときにvarchar 30などサイズを決めると思いますが、これは出来る限り指定したほうがいいのでしょうか?
参考となる記事などでも構いませんので、その理由も教えていただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/11/01 05:17

MySQLのバージョンも記載ください。string型ってchar型やvarchar型ではないのでしょうか?
m.ts10806

2018/11/01 05:20

MySQLをタグに追加しておいてください
baron3

2018/11/01 09:21

バージョン、タグ修正致しました。string型はchar型やvarchar型のことです。migrationファイルの認識で書いてしまったのでこちらも修正致しました。よろしくお願いします。
guest

回答2

0

親子関係が分岐していくモデルを想定しているのでしたら木構造を学習する必要があります。

親の情報だけもつものは隣接リストモデルといって、単純ですが取扱が面倒です。
参照の際は入れ子集合モデルというデータ管理をかませると一気に楽になります。
SQLで入れ子集合モデルを実現するにはサーバー側でプロシージャという仕組みで
変換をする必要があります。

投稿2018/11/01 09:34

yambejp

総合スコア114505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

今回のケースではコメントに対して返信があった場合、そのコメントを親とすることでyoutubeと同じようなコメント欄が実現できました。
コメントテーブルとリプライテーブルでDB構成が似通る為、パフォーマンス等の問題があるようでしたらコメントで教えて頂ければ幸いです。

木構造のDB構成についてはこちらが参考になりました。yambejpさんヒントを与えてくださりありがとうございます。

DB構成

** Posts table**
|column|type|key|comment|
|:--|:--:|--:|
|post_id|int|PRIMARY KEY|記事ID
|post_body|text||記事本文
|post_user|string|uuid|ユーザー
|created_at|timestamp||投稿日時

** Comments table**
|column|type|key|comment|
|:--|:--:|--:|
|comment_id|int|RIMARY KEY|コメントID
|comment_body|text||コメント本文
|comment_user|string|uuid|ユーザー
|parent_podt|int|FOREIGN KEY : posts(post_id)|親記事
|created_at|timestamp||投稿日時

** Replies table**
|column|type|key|comment|
|:--|:--:|--:|
|reply_id|int|RIMARY KEY|返信ID
|reply_body|text||返信本文
|reply_user|string|uuid|ユーザー
|reply_comment_parent|int|FOREIGN KEY : comments(comment_id)|親コメント
|created_at|timestamp||投稿日時

HTML

1@foreach ($comments as $comment) 2<div class="media d-block d-md-flex mt-3"> 3 <div id="commentIDcar1" class="media-body text-center text-md-left ml-md-3 ml-0" data-comment="1"> 4 <div id="comment-body"> 5 <h5 id="parent1" class="font-weight-bold mt-0"> 6 <a href="#" class="userName">{{$comment->comment_user}}#{{$comment->comment_id}}</a> 7 <a href="#" class="float-right replay"> 8 <i class="fa fa-reply"></i> 9 </a> 10 </h5> 11 {!! nl2br(e($comment->comment_body)) !!} 12 </div> 13 @if(!is_null($comment->replies)) 14 @foreach ($comment->replies as $replay) 15 <div class="media d-block d-md-flex mt-3"> 16 <div id="commentIDcar1" class="media-body text-center text-md-left ml-md-3 ml-0" data-comment="1"> 17 <div id="comment-body"> 18 <h5 id="parent1" class="font-weight-bold mt-0"> 19 <a href="#" class="userName">{{$replay->reply_user}}#{{$replay->reply_id}}</a> 20 <a href="#" class="float-right replay"> 21 <i class="fa fa-reply"></i> 22 </a> 23 </h5> 24 {!! nl2br(e($replay->reply_body)) !!} 25 </div> 26 27 </div> 28 </div> 29 @endforeach 30 @endif 31 </div> 32</div> 33@endforeach

投稿2018/11/14 07:40

編集2018/11/14 07:43
baron3

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問