Laravel&雄辩 - 查询朋友'关系

时间:2015-08-15 18:40:27

标签: laravel orm eloquent

假设您有用户和朋友架构

user:
   - id
   - username

friends:
   - id
   - user_id
   - friend_id

A'友谊'通过有两个相互记录来确定。我们说如果它只是一种单向关系,那么这是一个未决请求。所以在朋友表中:

user_id: 5 | friend_id: 6
user_id: 6 | friend_id 5

在用户模型中,您将拥有:

public function friends()
    {
        return $this->belongsToMany(self::class,'friends','user_id','friend_id')->withTimestamps();
    }

然而,这不是整个故事,因为这并不能检查是否存在相互关系。

你会如何设置? friends()方法是否应该负责进一步查询数据?或者这种方法是否合适,以及你想要获得相互友谊的实例,你应该附加一个查询范围?例如

$this->user->friends->mutual()

OR

$this->user->friends->pending()

1 个答案:

答案 0 :(得分:0)

根据this answer结束计算出来。但是,我将merge()功能更改为intersect(),因为我没有使用approved标志来确定友谊是相互的天气。我只是使用两种关系的存在。

所以在我的情况下。关系是:

public function myFriends()
{
    return $this->belongsToMany(self::class,'friends','user_id','friend_id')->withTimestamps();
}

public function friendsOf()
{
    return $this->belongsToMany(self::class,'friends','friend_id','user_id')->withTimestamps();
}

另一个逻辑是:

public function getFriendsAttribute()
{
    if ( ! array_key_exists('friends', $this->relations)) $this->loadFriends();

    return $this->getRelation('friends');
}

protected function loadFriends()
{
    if ( ! array_key_exists('friends', $this->relations)) $this->setRelation('friends', $this->mergeFriends());
}

protected function mergeFriends()
{
    return $this->myFriends->intersect($this->friendsOf);
}