2015-04-23 74 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(); 
}