質問: 多対多リレーションの認識で曖昧な部分があります。 「モデルAとモデルBが、多対多関係である」とは「あるAは複数のBを持つことができ、あるBは複数のAを持つことができる」関係だと認識しています。 この認識は正しいでしょうか? よくSNSにある以下の機能は多対多ですか? ・ユーザー(User)が投稿(Post)に「いいね」する機能 ・ユーザー(User)が他のユーザー(User)を「フォロー」する機能 これらの機能をLaravel標準の多対多リレーションを使わずに実装したら、いろんな問題が発生したので、多対多で実装すべきだと思いました。 フォロー機能は、両モデルが同じUserですが多対多になりますか。 これらの機能を実装するスタンダードなやり方を知りたいです。 以下のやり方は正しいでしょうか? ### 「いいね」機能 中間テーブルのカラムは user_id, post_id です。 ``` //Userクラス public function posts() { return $this->belongsToMany('App\Post'); } //Postクラス public function users() { return $this->belongsToMany('App\User'); } ``` ### 「フォロー」機能 ユーザーのフォロー一覧、フォロワー一覧、相互フォロー一覧などを取得できることが前提です。 中間テーブル follows のカラムは user_id, follow_user_id です。 ``` //Userクラス //自分がフォローしているユーザーを取得 public function my_follow_users() { return $this->belongsToMany('App\User', 'follows', 'user_id', 'follow_user_id'); } //自分のフォロワーを取得 public function my_follower_users() { return $this->belongsToMany('App\User', 'follows', 'follow_user_id', 'user_id'); } ``` 相互フォローの取得は複雑になりそうです。 ### その他疑問 ・Laravelでいいね機能を作ってみた この記事のように「いいね」実装に多対多を使わない例を見るのですが、どちらが良いでしょうか? 中間テーブルのモデルクラス内にもリレーションメソッドを記述しているようです。 ``` 中間テーブルのモデルLikeに、postメソッドとuserメソッドをbelongsToで定義。 Userモデルに、likesメソッドをhasManyで定義。 Postモデルに、userメソッドをbelongsTo、likesメソッドをhasManyで定義。 ``` ・中間テーブルの2カラム(例 user_id, post_id)は外部キー制約を付け、かつユニーク制約をつけるべきですか? 質問が多くてすみません。ご回答いただけると幸いです。
回答: > > この記事のように「いいね」実装に多対多を使わない例を見るのですが、どちらが良いでしょうか? > > > 多対多は柔軟に対応できる反面、実装が複雑になったり整合性を取るのが大変になりがちです。 もし多対多を使わないで済むなら使わないにこしたことはないと思います。 以下の記事を読ませていただきましたが、特に違和感もありませんし、この実装を参考にして良いと思います。 Laravelでいいね機能を作ってみた