8

雄弁との友情関係をモデル化する最良の方法は何ですか? 私のテーブル スキーマは以下のとおりです。次のように、すべての友人を取得できる関係を 1 つ定義したいと思います。

<?php

class User extends Eloquent {

public function friends() {
    return $this->belongsToMany('User', 'friendships', 'user_id', 'friend_id')->orWhere($this->id,'=', 'friend_id');
  }
}

+----+---------+-----------+----------+---------------------+---------------------+
| id | user_id | friend_id | state    | created_at          | updated_at          |
+----+---------+-----------+----------+---------------------+---------------------+
|  1 |       3 |         1 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 |       2 |         3 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------+-----------+----------+---------------------+---------------------+

上記の関係は、ユーザー ID が 3 の友達を探すときにほぼ機能します。ユーザー 1 と 3 を取得しますが、明らかに 1 と 2 が必要です。

フレンドシップテーブル

user_id: フレンドシップをリクエストしたユーザー ID
friend_id: 対象のフレンドのユーザー ID
状態: フレンドシップが保留中、承認済み、またはブロックされているかどうか。
created_at と updated_at

Laravel多対多の自己参照テーブルからの解決策があることを認識していますが、関係の両側から友人を取得できる1つの方法でしか機能しませんが、たとえば、ユーザー1と3が友人である場合、 1 つの行 user_id = 3 および friend_id = 1 で、次の行ではその逆です。(または、2 つの行がない場合は、2 つのクエリを実行する必要があります)。

4

3 に答える 3

6

2 つのルックアップを実行し、ユニオン クエリを使用して、データベースに 1 回だけアクセスすることができます。これらすべてをカスタム関数に入れます。

class User extends Eloquent {

  public function friends()
  {
     $first = $this->belongsToMany('User', 'friendships', 'user_id', 'friend_id');  
     return $this->belongsToMany('User', 'friendships', 'friend_id', 'user_id')->union($first);  
  }
}
于 2013-07-25T11:26:09.503 に答える
-3

条件を使用して必要な値をロードすることを提案します

  • この例では、 query を使用して user_id と fiend_id を condition でロードしたとします。

    " select * from friends WHERE user_ID = '$id' OR friend_ID = '$id'"

$id : 友達に見せたいユーザーIDです。

結果をロードするために使用するPHPのWHILEループ内で、条件を作成して結果をフィルタリングできます

while ... {

if (friendship['user_id'] == $id) {

$f_id = friendship['friend_id'] ;  }

// other instructionS...

else  {

$f_id = friendship['user_id'] ;  } 

// other instructionS...

}

この場合、両方のテーブル列からデータをロードし、毎回ユーザー ID で列をフィルター処理し、彼の友人の ID のみを許可します。フィルターは、あなたが自分自身と友達であることをユーザーに伝えていませんでした。

申し訳ありませんが、例を説明するために mysql を使用しました

于 2013-07-28T10:13:08.983 に答える