为相互关注的用户建立一个有说服力的关系

mcvgt66p  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(298)

我有一个像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\u关系时,跳过那些不被接受的(就像软删除一样)。我应该如何修改我的关系来实现这一点?或者我应该创建另一个名为“requst\u rel”的表,并在接受后将其移到“follow\u rel”表中?任何帮助都将不胜感激

brjng4g3

brjng4g31#

只需返回与->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]);
    }
}
gzszwxb4

gzszwxb42#

我不完全确定我是否理解,但听起来你想查询只被接受的关系?如果是的话,你想用 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;

相关问题