在Laravel 4中更新数据透视表的附加列

时间:2015-05-30 23:09:44

标签: laravel laravel-4 eloquent relationship pivot-table

我有以下架构:

public function up()
    {
        Schema::create('messages', function(Blueprint $table) {
            $table->increments('id');
            $table->mediumText('subject');
            $table->text('message');
            $table->boolean('draft');
            $table->integer('sender_id')->unsigned();
            $table->softDeletes();
            $table->timestamps();

            $table->foreign('sender_id')->references('id')->on('users')->onUpdate('cascade');
        });

        Schema::create('message_assets', function(Blueprint $table) {
            $table->increments('id');
            $table->integer('message_id')->unsigned();
            $table->string('filename', 255);
            $table->softDeletes();

            $table->foreign('message_id')->references('id')->on('messages')->onUpdate('cascade');
        });

        Schema::create('message_users', function(Blueprint $table) {
            $table->increments('id');
            $table->integer('message_id')->unsigned();
            $table->integer('user_id')->unsigned();
            $table->integer('read')->default(0);
            $table->string('folder', 255)->nullable();
            $table->softDeletes();

            $table->foreign('message_id')->references('id')->on('messages')->onUpdate('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade');
        });
    }

我想要做的是在用户查看邮件时将数据透视表中的read列更新为true。我让控制器发现了它如何从枢轴获取相关记录并仅更新read字段。

这是关系:

public function to()
{
    return $this->belongsToMany('SeriousJelly\Modules\Users\Models\User', 'message_users', 'message_id', 'user_id');
}

1 个答案:

答案 0 :(得分:1)

我对你究竟想要什么有点不清楚。一个小的控制器代码可能很高兴看到你尝试了什么以及你想要做什么。

那说,这可能有效。

$message->to()->updateExistingPivot($user_id, ['read'=> 1]);

使用to有点含糊不清,我可以使用user来更清楚地假设它在Message模型上。

docs有一些很好的信息。

更新评论

以下代码适用于Laravel 5,但我不确定4.2。

$message->to()->sync([$user_id => ['read'=> 1]], false);