2015-08-15 177 views
0

比方說你有用戶和朋友架構Laravel和雄辯 - 查詢「朋友」關係

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

回答

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