当前位置: 首页 > 面试题库 >

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

卫俊誉
2023-03-14
问题内容

我正在尝试与Laravel创建一个友谊系统(我从它开始),但是我被各种关系所困扰。事情是这样的:有一个表Users和一个表Friends,其中包含以下列:

friends: id, user_id, friend_id, accepted.

它看起来像“多对多”,所以这是我在User类上设置的:

class User extends Eloquent {
    function friends()
    {
        return $this->belongsToMany('User');
    }
}

但是当我尝试一个:

$friends = User::find($id)->friends()->get()

我有这个错误:

Base table or view not found: 1146 Table 'base.user_user' doesn't exist

我想获取用户好友列表,无论用户发送邀请还是收到邀请都无所谓。因此,用户可以根据user_id或friend_id,然后根据该列检索其他用户的数据

任何的想法?谢谢!

编辑:这是我使用的代码:

$usersWithFriends = User::with('friendsOfMine', 'friendOf')->get();
$user = User::find(Auth::id())->friends;

foreach($user as $item) {
    echo $item->first()->pivot->accepted;
}

问题答案:

tldr; 您需要2个反向关系才能使其正常工作,请在下面检查SETUP和USAGE

首先是 错误 -这是您的关系应如何显示:

function friends()
{
  return $this->belongsToMany('User', 'friends', 'user_id', 'friend_id')
    // if you want to rely on accepted field, then add this:
    ->wherePivot('accepted', '=', 1);
}

然后它将正常工作:

$user->friends; // collection of User models, returns the same as:
$user->friends()->get();

设定

但是, 您希望该关系以两种方式起作用。Eloquent不提供这种关系,因此 您可以使用2个反向关系并合并结果

// friendship that I started
function friendsOfMine()
{
  return $this->belongsToMany('User', 'friends', 'user_id', 'friend_id')
     ->wherePivot('accepted', '=', 1) // to filter only accepted
     ->withPivot('accepted'); // or to fetch accepted value
}

// friendship that I was invited to 
function friendOf()
{
  return $this->belongsToMany('User', 'friends', 'friend_id', 'user_id')
     ->wherePivot('accepted', '=', 1)
     ->withPivot('accepted');
}

// accessor allowing you call $user->friends
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))
    {
        $friends = $this->mergeFriends();

        $this->setRelation('friends', $friends);
    }
}

protected function mergeFriends()
{
    return $this->friendsOfMine->merge($this->friendOf);
}

用法

通过这种设置,您可以执行以下操作:

// access all friends
$user->friends; // collection of unique User model instances

// access friends a user invited
$user->friendsOfMine; // collection

// access friends that a user was invited by
$user->friendOf; // collection

// and eager load all friends with 2 queries
$usersWithFriends = User::with('friendsOfMine', 'friendOf')->get();

// then
$users->first()->friends; // collection

// Check the accepted value:
$user->friends->first()->pivot->accepted;


 类似资料:
  • 表朋友:id、用户id、朋友id。 表用户配置文件:id、用户id、名字。。。 如何通过雄辩的ORM获得用户的朋友列表? 用户id:5 |朋友id:6 user_id: 6|friend_id5 类似问题: 与拉拉维尔的友谊系统:多对多关系 拉维尔 我无法理解是谁调用了getFriendsAttribute()方法。 以及如何做到这一点查询生成器。 谢谢

  • 我在一个laravel控制器中运行以下代码, 但是我似乎从服务器上得到了以下错误, {“error”:{“type”:“ErrorException”,“message”:“preg_replace():参数不匹配,模式为字符串,而替换为数组”,“file”:“/Users/S/Sites/app api/vendor/laravel/framework/src/illumb/Support/he

  • 我有3个标签:用户、教师和帖子。 用户: id-integer name-string 教师: id-integer 教师id-integer 用户id-integer 姓名-string 帖子: id-integer user\u id-integer title-string 用户模型: 教师模式: ??问题是我如何使用这样的东西:

  • 我在Books表和Authors表之间有多对多的关系。透视表(author_book)包含author_id和book_id。

  • 这是项目迁移 这是时间表 这样用户就可以迁移了 这是我的项目模型 这是我的时间表模型: 这是我的用户模型 现在,我从项目返回我的查询 这是可以的,但user_id用户在timesheets.user_id我不能得到它的时间表,并得到它 此控制器按时间表中的项目id返回项目和时间表,但时间表中的用户id我不知道如何将其输入系统

  • 问题内容: 我正在编写一个友谊系统,它有两个表。 成员 ID 用户名 密码 朋友们 ID 用户身份 friend_id 状态 假设我想要一个可以选择成员$ userId的朋友ID的查询,如何在一个查询中做到这一点? 我找到了一个解决方案,可以进行2次查询。拳头选择朋友在哪里,第二个选择朋友在哪里,然后将它们混合成一个数组。如果没有其他解决方案,我将使用它。 请对SQL结构和查询有任何想法吗? 问题