2017-02-14 93 views
0

我正在制作一个网站,用户可以在其中发布和阅读彼此的帖子。 我想让所有用户都可以标记他们已阅读的帖子,因此只显示没有阅读的帖子。也应该可以撤销这一点。所以我有一个用户和帖子的模型和表格。使用Laravel创建或更新

我认为这样做的方式是创建一个PostsRead表格,其中包含用户和帖子的唯一ID。然后,我可以获取所有帖子并从PostsRead表中删除这些帖子。所以这个问题是:

1)这是一个很好的(最佳实践 - ish)的方式来做到这一点?

2)如何?我想我需要检查包含user_id/post_id对的PostsRead表中是否有记录。如果不是,请插入一个新行。如果是这样,我想我需要更新当前行。它应该可能有一个布尔型字段来告诉帖子是否被读取。代码如何呢?

当我在脑海中经历它时,这种方法似乎......很奇怪。我在这里错了吗?我希望这个问题是可以理解的。

回答

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]);