2016-07-30 23 views
1

我需要確保當用戶發送好友請求並且其他用戶接受它時,兩個用戶的好友列表都會更改。不僅僅是接受請求的人。這就是問題。當用戶接受好友請求時,好友將出現在他的好友列表中,但不會出現在發送好友請求的好友列表中。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'); 
} 
+0

泰勒居然提到在GitHub的問題,這個具體的例子,所以我大概會在數據庫中https://github.com/laravel/framework/issues/441 – ExoticChimp

回答

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() 
} 

而且你接受/待處理/拒絕的請求可以是數據透視表中的簡單列。

您還必須實現對User型號的friends()功能:

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

朋友表去有以下字段:「USER_ID 「,」friend_id「,」接受「是不夠的? –

+0

@labasGamePagevisogero但如果一個'用戶'是多個其他用戶的朋友呢?你將如何將所有的ID保存在你的'friend_id'列中?也許我錯了,但我認爲朋友和朋友的關係是一種雙向關係,那麼哪個朋友應該維護'friend_id',並且你怎麼知道這一點......你也會遇到問題稍後搜索和排序。 – Grigio

+0

好的。那麼我應該刪除我的「朋友」表並創建像「friend_user」這樣的新表嗎? –

-1

你可以試試這個?

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

你應該總是提供你正在編寫的代碼的解釋。只有代碼答案對未來的讀者來說不是很有用 – ExoticChimp

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()); 
}