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

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/26 15:24
2019/02/26 15:30
2019/02/26 21:27
2019/02/28 12:34