在Laravel Eloquent中检测用户是否为朋友,有朋友请求或有朋友请求的最佳方式

时间:2015-07-31 16:27:27

标签: php laravel eloquent

我正在尝试创建一个用户个人资料,其中包含一些朋友管理按钮,但您只想查看与您和个人资料相关的内容。

我有两张桌子:

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个查询,每个状态一个,可能不是最好的性能。

我该怎么做?

2 个答案:

答案 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";

请求中的相同

开箱即用灵魂阅读eloquent-relationships eager-loading