我正在创建一个网站,用户可以在其中发布和阅读其他帖子。 我希望所有用户都可以标记他们已阅读的帖子,从而只显示未读取的帖子。也应该可以撤消这一点。所以我有一个用户和帖子的模型和表格。
我想这样做的方法是创建一个PostsRead表,其中包含用户和帖子的唯一ID。然后我可以获取所有帖子并从PostsRead表中删除它们。所以问题是:
1)这是一种很好的(最佳实践)方式吗?
2)怎么样?我想我需要检查PostsRead表中是否有包含user_id / post_id对的记录。如果不是,请插入新行。如果是,我想我需要更新当前行。它应该有一个布尔字段来告知是否读取了帖子。这个代码怎么样?
当我在脑海中经历它时,这种方法似乎......很奇怪。我在这里走错了路吗?我希望这个问题是可以理解的。
答案 0 :(得分:0)
是的,这是最好的做法。
创建一个名为' user_read'使用' user_id'和' post_id' (均为主键)
Schema::create('user_read', function (Blueprint $table) {
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->integer('post_id')->unsigned()->index();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
$table->timestamps();
$table->primary(['user_id', 'post_id']);
});
要进行设置,您应该在模型中拥有此关系。
user.php的
public function reads()
{
return $this->belongsToMany(Post::class, 'user_read', 'user_id', 'post_id')
->withTimestamps();
}
要存储用户阅读的新帖子,您可以这样做
//1 and 3 are the posts ids
$user->reads()->sync([1, 3]);