我有一个像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”表? 任何帮助将不胜感激,谢谢
答案 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]);
}
}