【问题标题】:Updating a pivot table's additional column in Laravel 4在 Laravel 4 中更新数据透视表的附加列
【发布时间】:2015-08-13 15:47:58
【问题描述】:

我有以下架构:

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

【问题讨论】:

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


    【解决方案1】:

    我有点不清楚你到底想要什么。一些控制器代码可能会很好地了解您尝试了什么以及您正在尝试做什么。

    也就是说,这可能有效。

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

    使用to 有点模棱两可,我可能会使用user 让它更清楚一点,假设这是在Message 模型上。

    docs 有一些很好的信息。

    每条评论更新

    下面的代码在 Laravel 5 中有效,但我不确定是否适用于 4.2。

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

    【讨论】:

    • 谢谢,我实际上已经尝试过了,但我似乎没有收到任何错误,并且“读取”字段似乎没有得到更新。 $this->model->to()->updateExistingPivot($userId, ['read'=> 1]);
    • @SeriousJelly 我根据你们的 cmets 更新了我的答案,检查一下,让我知道它是否适合你。
    • 抱歉,但会引发以下错误:完整性约束违规:1048 列“message_id”不能为空(SQL:插入message_users(message_id,read,user_id) values (, 1, 1))" *我想更新行,而不是插入新行?
    • @SeriousJelly 在调用之前 dd($message->toArray()) 会发生什么?
    • 是的,听起来您没有收到消息。您可以在问题中发布您的控制器代码吗?
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多