Laravel。显示两位用户的已接受朋友

时间:2016-07-30 17:44:29

标签: php laravel

我需要确保当用户发送好友请求而另一个用户接受它时,两个用户的好友列表都会发生变化。不仅是接受请求的人。这就是问题。当用户接受好友请求时,好友出现在他的好友列表中,但不会出现在发送好友请求的好友中。

这是我的控制器功能:

   public function add($id) // Add friends
   {
       $friend = new Friend();
       $friendId = User::where('id', $id)->first();
       $friend->user_id = Auth::user()->id;
       $friend->friend_id = $friendId->id;
       $friend->save();
       return redirect('/');
   }

显示好友请求

public function showRequests()
{
        $requests = Friend::where('friend_id', '=', Auth::user()->id)->where('accepted', '=', 0)->get();
        return view('users.friends.requests', compact('requests'));
}

接受好友请求

public function accept($id)
{
    $friend = Friend::where('id', $id)->first();
    $friend->accepted = 1;
    $friend->save();
    return redirect()->back();
}

显示好友列表

public function show()
{
    $friends = Friend::where('friend_id', '=', Auth::user()->id)->where('accepted', '=', '1')->get();
    return view('users.friends.show', compact('friends'));
}

关系。 user.php的:

public function friend()
{
    return $this->hasMany('App\Friend');
}

Friend.php:

public function user()
{
    return $this->belongsTo('App\User');
}

3 个答案:

答案 0 :(得分:1)

您考虑过添加pivot table吗? 您可以使用Laracasts/Generators轻松制作支点。

创建数据透视表后,您将执行类似

的操作
public function add(...) { // Add friends
   $friend1 = User::find(1);
   $friend2 = User::find(2);
   $friend1->friends()->attach($friend2);
}

然后为了得到关系,你会做:

public function show($id) {
    $user = User::find($id)
    return $user->friends()->get()
}

您的接受/待处理/拒绝请求可以是数据透视表中的简单列。

您还必须为friends()模型实施User功能:

class User extends Authenticatable {
...
    public function friends() {
        return $this->belongsToMany('App\User')->withTimestamps();
    }
}

答案 1 :(得分:1)

这只适用于friends表。

public function friendsOfMine()
{
    return $this->belongsToMany('App\User', 'friends', 'user_id', 'friend_id');
}

public function friendOf()
{
    return $this->belongsToMany('App\User', 'friends', 'friend_id', 'user_id');
}

public function friends()
{
    return $this->friendsOfMine()->wherePivot('accepted', true)->get()->merge($this->friendOf()->wherePivot('accepted', true)->get());
}

答案 2 :(得分:-1)

你能试试吗?

public function show()
{
    $friends = Auth::user()->friend()->where('accepted', '=', '1')->get();
    dd($friends);
}