2017-02-14 13 views
0

ユーザーが投稿を投稿したり、投稿を読むことができるサイトを作っています。 私はすべてのユーザーが自分が読んだ投稿をマークすることができるようにしたいので、読まれていない投稿のみを表示します。これを元に戻すことも可能です。だから私はモデルとテーブルの両方のユーザーと投稿している。Laravelで作成または更新

私がやったと思ったのは、ユーザーと投稿の一意のIDを含むPostsReadテーブルを作成することでした。それから私はすべての投稿を取得し、PostsReadテーブルから削除することができました。したがって、質問は次のとおりです。

1)これは良い(ベストプラクティス-ish)方法ですか?

2)方法は?私は、user_id/post_idのペアを含むPostsRead-tableにレコードがあるかどうかを確認する必要があると思います。そうでない場合は、新しい行を挿入します。もしそうなら、私は現在の行を更新する必要があると思います。ポストが読み込まれているかどうかを示すbooleanフィールドが必要です。これのコードはどのようにしていますか?

私は私の頭の中でそれを通過すると、このアプローチは....奇妙なようです。私は間違ったトラックにいますか?私はその質問が理解できることを願っています。

答えて

0

はい、このようにするのがベストプラクティスです。

はあなたのモデルでは、この関係を持っている必要があり、それを設定するには(主キーの両方)

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_ID」と「post_idの」で「user_read」と呼ばれるテーブルを作成します。

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]); 
を行うことができます読むことを新しい投稿を保存するには
関連する問題