为彼此追随的用户建立雄辩的关系

时间:2018-12-12 21:18:53

标签: mysql laravel eloquent

我有一个像Instagram这样的应用程序,用户可以在其中互相关注,所以我将其放在用户模型中:

    public function following()
{
    return $this->belongsToMany(User::class, 'follow_rel', 'follower_id', 'followed_id');
}

public function followers()
{
    return $this->belongsToMany(User::class, 'follow_rel', 'followed_id', 'follower_id');
}

public function follow(User $user)
{
    $this->following()->syncWithoutDetaching($user);
}

public function unfollow(User $user)
{
    $this->following()->detach($user);
}

这是我的迁移:

        Schema::create('follow_rel', function (Blueprint $table) {
        $table->increments('id');
        $table->boolean('accepted')->default(false);
        $table->unsignedInteger('follower_id');
        $table->unsignedInteger('followed_id');
        $table->timestamps();
    });

它工作正常,但我不知道如何处理“已接受”列。 就像Instagram一样,我希望第一个用户发送请求,如果第二个用户的帐户是私有帐户,则将accepted列设置为false,因此当我编写查询以获取follow_relations时,请跳过那些不被接受的内容(就像软删除一样) )。 我应该如何修改我的关系以实现这一目标? 还是应该制作另一个名为“ requst_rel”的表,并在接受后将其移至“ follow_rel”表? 任何帮助将不胜感激,谢谢

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解,但是听起来您想查询仅被接受的关系?如果是这样,您要使用wherePivot方法:

$followers = $user->followers()-> wherePivot('accepted', true)->get();

或者您可以在模型上创建方法:

public function accepted_followers()
{
    return $this->belongsToMany(User::class, 'follow_rel', 'followed_id', 'follower_id')->wherePivot('accepted', true);
}

$followers = $user->accepted_followers;

答案 1 :(得分:0)

只需使用-> wherePivot()返回一个关系

return $this->belongsToMany(User::class, 'follow_rel', 'follower_id', 'followed_id')->wherePivot(accepted, 1);

不幸的是-> syncWithoutDetaching()不适用于数据透视表。您必须手动确定该过程:

public function follow(User $user)
{
    if (! $this->following->contains($user)) {
        $this->following()->attach($user, ['accepted' => 1]);
    }
}