【问题标题】:Create or Update with Laravel使用 Laravel 创建或更新
【发布时间】:2017-02-14 23:09:50
【问题描述】:

我正在创建一个网站,用户可以在其中发布和阅读彼此的帖子。 我想让所有用户都可以标记他们已阅读的帖子,从而仅显示未阅读的帖子。也应该可以撤消此操作。所以我有一个用户和帖子的模型和表格。

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

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

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

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

【问题讨论】:

    标签: php database laravel eloquent


    【解决方案1】:

    是的,这样做是最好的做法。

    使用“user_id”和“post_id”(均作为主键)创建一个名为“user_read”的表

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

    要设置它,你应该在你的模型中有这个关系。

    用户.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]);
    

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多