2015-04-23 91 views
5

我想在laravel 5做一個友誼系統,我被卡住了。 我有一個看起來像這樣的friends_user表:Laravel - 友誼

  • ID
  • USER_ID
  • friend_id
  • 狀態

這裏是點,我去一個用戶頁面,以及ii想看看我與這位用戶的關係如何,4解決方案:

  • 我們是朋友
  • 我們不是
  • 他不接受該請求尚未
  • 我要確認與否。

我想創建一個方法,檢查用戶是否與其他,簡單的朋友。 我有一個「狀態」欄這是一個布爾值(0表示待定,1個用於朋友) 對我來說,完美的解決方案是能夠在一個方法來檢查:

  • 用戶是朋友, ('user_id',Auth :: user() - > id) - >和('friend_id',$ friend-> id)或者相反('user_id',$ friend-> id) - >和(' friend_id',Auth :: user() - > id),它必須檢查2種感官
  • 我發送了請求並且必須等待他的回答
  • 我收到請求並且必須接受它。
  • 我們不是朋友,所以我可以加他。

所以,如果你能告訴我在哪裏,我錯在這裏我,這裏是我的邏輯(只是爲了檢查,如果用戶的朋友):user.php的

public function isFriend($slug) 
{ 
    // Get both user 
    $user = Auth::user(); 
    $receiver = User::where('slug', $slug)->first(); 
    // get list of friends (so who have status = 1) 
    $result = Friends::where('status', 1); 
    // Get users where user id is equal to connected 
    $result = $result->where('user_id', $user->id)->where('friend_id', $receiver->id); 
    $result = $result->orWhere('user_id', $receiver->id)->where('friend_id', $user->id); 
    $result = $result->get(); 
    if(count($result) == 0) 
     return false; 
    return true; 
} 

我在我看來,做這些檢查後。

這很有效,但只有當我(當前用戶)發送請求,但如果它是相反的,即使狀態爲0,它也會返回給我的用戶。我認爲我的$結果會擦除其他的isn'它呢?那麼解決方案是什麼?

我希望這很清楚,如果你能告訴我如何以乾淨的方式做到這一點,那就太好了。

+0

退房這一系列.. https://laracasts.com/series/build-a-laravel-app-from-scratch書中有關於朋友 – bretterer

+2

你弄亂的東西一點點教訓你爲什麼有朋友桌?朋友不是用戶?如果是這樣,你爲什麼不在用戶表上有多對多的自我關係? –

+1

@bretterer您需要訂閱才能訪問視頻。 (但如果你想了解laravel和php,這是一個非常好的投資9美元的方法) – Needpoule

回答

3

這是一個常見的錯誤。小心你的「orWhere」條款。

public function isFriend($slug) 
{ 
    // Get both user 
    $user = Auth::user(); 
    $receiver = User::where('slug', $slug)->first(); 
    // get list of friends (so who have status = 1) 

    $result = Friends::where('status',1)->where(function($query) use ($receiver,$user) 
    { 
     $query->where([ 
      'user_id' => $user->id, 
      'friend_id' => $receiver_id 
     ])->orWhere([ 
      'user_id' => $receiver->id, 
      'friend_id' => $user->id 
     ]); 

    })->get(); 

    return ! $result->isEmpty(); 
}