Laravel 5.2 友谊系统:多对多关系

Posted

技术标签:

【中文标题】Laravel 5.2 友谊系统:多对多关系【英文标题】:Laravel 5.2 Friendship system: Many to Many relationship 【发布时间】:2016-09-27 23:15:37 【问题描述】:

表朋友:id、user_id、friend_id。

表 user_profiles:id、user_id、first_name...

如何通过 Eloquent ORM 获取用户好友列表?

user_id: 5 |朋友ID:6

user_id: 6 |朋友 ID 5

类似问题:

Friendship system with Laravel : Many to Many relationship

Laravel & Eloquent - Query 'Friends' Relationship

我不明白是谁调用了getFriendsAttribute()方法。

以及如何做到这一点查询生成器。

谢谢!

【问题讨论】:

【参考方案1】:

您可以在User 模型上定义关系:

class User extend Model

    ...

    // Get list of who sent me a friend request
    public function myFriends()
    
        return $this->belongsToMany(get_class($this), 'friends', 'friend_id');
    

    // Get the list of friends whom I invited
    public function friendsOf()
    
        return $this->belongsToMany(get_class($this), 'friends', 'user_id', 'friend_id');
    

    // Merge
    public function getFriendsAttribute()
    
        return $this->myFriends->merge($this->friendOf);
    

然后你可以通过$user->myFriends获取用户的好友列表,通过他们的名字查询好友:$user->myFriends()->where('first_name', '=', 'John')->get()

【讨论】:

我有关系。但我可以得到一个只有 user_id 或 user_friend 的列表。如何合并请求? 我没有收到您关于“但我只能获得 user_id 或 user_friend 的列表。如何合并请求?”的问题你能更清楚你想达到什么目标吗? 你的意思是通过某个user_id获取好友列表吗? 如果我这样写:return $this->belongsToMany(get_class($this), 'users_friends', 'friend_id');我收到了向我发送好友请求/邀请的人 如果我这样写: return $this->belongsToMany(get_class($this), 'users_friends', 'user_id', 'friend_id');我得到了我邀请的朋友名单。但我在他们的朋友列表中不可见。 @Anton 如果你想同时显示邀请你的朋友和你被邀请的朋友,那么你可以使用merge() 合并这些关系,查看编辑后的答案。

以上是关于Laravel 5.2 友谊系统:多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:具有多对多关系的历史排名系统

Laravel5.1 模型 --多对多关系

Laravel 上的多对多问题关系

Laravel 4:具有额外关系的多对多

Laravel 多对多关系 sync() 其中

Laravel 多对多关系计数