我正在尝试创建一个用户个人资料,其中包含一些朋友管理按钮,但您只想查看与您和个人资料相关的内容。
我有两张桌子:
user_friendships - user_id | friend_user_id
user_friendship_requests - user_id | target_user_id
获得所有友谊和友谊请求的关系如下:
class User extends Model
{
public function friends()
{
return $this->belongsToMany('User', 'user_friendships', 'user_id', 'friend_user_id');
}
public function friendrequests()
{
return $this->belongsToMany('User', 'user_friendship_requests', 'user_id', 'target_user_id');
}
}
这很好但是如何检测我正在访问的用户的个人资料($profile = User::find(1234)
)是我的朋友还是他们有朋友要求我或我有朋友要求他们?
检查两个用户之间是否存在行,并查看哪些列包含哪些内容。我不确定最好的解决方法,因为3个查询,每个状态一个,可能不是最好的性能。
我该怎么做?
答案 0 :(得分:0)
您可以添加一个名为' relation'的列。包含枚举。
$table->enum('relation', ['request', 'friend']);
然而,你仍然需要担心相反的方式。例如,友谊将被定义为:
user_id | friend_user_id | relation
1 | 2 | friend
2 | 1 | friend
或仅使用一个唯一行,但您需要在SQL查询中包含更多检查。我想知道这两种方法中哪一种最合适。
答案 1 :(得分:0)
假设您的ID为50,您正在访问的个人资料ID为1234 很明显
$profile = User::find(1234)->friends()->get()
将检索用户及其所有朋友
但过滤这个朋友呢
$users = User::with(['friends' => function ($query) {
$query->where('friend_user_id', '=', '50');
}])->first();
if($user)return "he is a friend";
请求中的相同