使用Laravel创建或更新

时间:2017-02-14 23:09:50

标签: php database laravel eloquent

我正在创建一个网站,用户可以在其中发布和阅读其他帖子。 我希望所有用户都可以标记他们已阅读的帖子,从而只显示未读取的帖子。也应该可以撤消这一点。所以我有一个用户和帖子的模型和表格。

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

1)这是一种很好的(最佳实践)方式吗?

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

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

1 个答案:

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