2017-02-14 163 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]);