Laravel用户可以关注评论,类别,发布等

时间:2017-05-31 09:03:06

标签: php laravel-5 relational-database

我想实现一个跟随系统,其中User可以关注CommentCategoryPost等。我尝试过使用 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();
});

如何获取用户后面的所有categoriescomments。我也可以如何获得Cateogry或Commnets的追随者等。

请帮忙。

1 个答案:

答案 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