解決したいこと(というよりアドバイス頂きたいこと)
現在、Laravel6で小説の投稿サイトを作成しています。
そこで、リレーション関係の深いデータを取得する場面に出会しました。
一応やりたいことはできたのですが、何だかもっと良いコードの書き方があるような気がします。
そのため、自分のコードが綺麗かどうなのか。もっと他によいコードの書き方があるのか。あるいは中間テーブルを作った方が良いのか、などをアドバイスして頂きたく投稿させていただきました。
##やりたいこと
やりたいことはとてもシンプルでして、『あるユーザーがコメントされたレコードを全て取得したい』です。
(あるユーザーがコメントしたレコードではありません。)
##【追記】
やりたいことが説明不足だったため追記します。
下記画像のように、ユーザー(作家)のプロフィールからコメントされた一覧を表示しようと考えています。
テーブル設計
テーブル設計は以下の通りです。
【補足】
・users テーブル
・・・ユーザー情報の管理
・novels
テーブル・・・小説情報の管理
・episodes
テーブル・・・エピソード情報の管理(小説の中にエピソードが沢山ある)
・comments
テーブル・・・コメント情報の管理(エピソードの中にコメントが沢山ある)
commentsテーブル
のuser_id
にはコメントをしたユーザーのIDを保存しています。
自分で書いたコード
テーブル設計が上記の通りなので、コメントされたデータを取得しようとすると、usersテーブル→novelsテーブル→episodesテーブル→commentsテーブル
というように、関係が深くなってしまいます。
下記のコードでひとまず、自分が取得したいデータは全て取得することができました。
php
1$novels_id = User::find($user_id)->novels()->pluck('id'); 2$episodes_id = Episode::whereIn('novel_id', $novels_id)->pluck('id'); 3$comments = Comment::with('episode.novel', 'user')->whereIn('episode_id', $episodes_id)->get();
しかし、あまり綺麗なコードでもないと思うので、もっと他に良い書き方などがありましたら、アドバイス頂きたいです。
##他に考えた方法
他に考えた方法としては
・Commentsテーブル
にnovel_idカラム(FK)
やwriter_idカラム(FK)
などを追加する
・中間テーブルを作る。
などは考えたのですが、それなら上記のコードのままでも良いかなぁ、、、と思いました。
お手数をおかけしますが、アドバイスなど頂けましたら大変助かります。
何卒よろしくお願い致しますm(_ _)m
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/03 01:46
2021/02/03 06:50
2021/02/03 09:19 編集