2015-05-30 3 views
0

У меня есть следующая схема:Обновление дополнительного столбца сводной таблицы в Laravel 4

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 столбец в сводной таблице, чтобы верно, когда пользователь просмотра сообщения. У меня есть контроллер, прибитый его как раз как я могу получить соответствующую запись от стержня и обновить только поле read.

Вот связь:

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

ответ

1

Я немного непонятно, на что именно вы хотите. Маленький код контроллера может быть приятным, чтобы увидеть, что вы пробовали, и что вы пытаетесь сделать.

Это говорит, что это может сработать.

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

Использование to немного неоднозначное, я мог бы использовать user, чтобы сделать его немного более ясным, предполагая, что это на Message модели.

docs есть хорошая информация.

ОБНОВЛЕНИЕ НА COMMENT

ниже код работает в Laravel 5, но я не уверен, что с 4.2.

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

Спасибо, я на самом деле пробовал это, но я, кажется, не получил никаких ошибок, и поле «читать», похоже, не обновляется. $ this-> model-> to() -> updateExistingPivot ($ userId, ['read' => 1]); – ChrisBratherton

+0

@SeriousJelly Я обновил свой ответ на ваши комментарии, проверю его и дайте мне знать, если он сработает для вас. – whoacowboy

+0

Извините, но это порождает следующую ошибку: Нарушение ограничения целостности: 1048 Столбец 'message_id' не может быть нулевым (SQL: insert в значения 'message_users' (' message_id', 'read',' user_id') (, 1, 1)) «* Я хочу обновить строку, а не вставить новую? – ChrisBratherton

Смежные вопросы