我想实现一个跟随系统,其中User
可以关注Comment
,Category
,Post
等。我尝试过使用 Laravel Polymorphic 关系,但无法绕过它。如果有人可以指导我会很棒。
这是我尝试过的。
用户模型
public function categories()
{
return $this->morphedByMany(Category::class, 'followable', 'follows')->withTimestamps();
}
类别模型
public function followers()
{
return $this->morphMany(Follow::class, 'followable');
}
关注模式
public function followable()
{
return $this->morphTo();
}
public function user()
{
return $this->belongsTo(User::class);
}
关注迁移
Schema::create('follows', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->morphs('followable');
$table->timestamps();
});
如何获取用户后面的所有categories
,comments
。我也可以如何获得Cateogry或Commnets的追随者等。
请帮忙。
答案 0 :(得分:1)
你不需要Follow
模特
您所需要的只是像这样的数据透视表
followable
user_id - integer
followable_id - integer
followable_type - string
将folowers
方法添加到您需要关注的所有课程
例如
类别模型
public function followers()
{
return $this->morphToMany(User::class, 'followable');
}
然后在用户模型
中public function followers()
{
return $this->morphToMany(User::class, 'followable');
}
public function followedCategories()
{
return $this->morphedByMany(Category::class, 'followable')->withTimestamps();
}
public function followedComments()
{
return $this->morphedByMany(Comment::class, 'followable')->withTimestamps();
}
public function followedPosts()
{
return $this->morphedByMany(Post::class, 'followable')->withTimestamps();
}
// and etc
public function followedStuff()
{
return $this->followedCategories
->merge($this->followedComments)
->merge($this->followedPosts);
}
然后,您可以通过访问某些类别的关注者,评论或发布或任何您想要的内容(如果它可以跟随courcse)来实现您的目标 例如:
$folowers = $category->folowers;
// will return all followers this category
$all = $user->followedStuff();
// will return collection of all things followable by the user