2015-11-05 11 views
8

laravelを初めて使用しています。私はlaravel 5アプリに取り組んでおり、私はここで立ち往生しています。私は、次のような2つのモデルている:私のようなSQLクエリを持ってLaravel 5でEloquentを使用してピボットテーブルを更新する方法

Table Name: message_user 
Colums: 
message_id 
user_id 
status 

次のような私のピボットテーブルを与えるメッセージとユーザー間の多対多の関係を

class Message extends Eloquent{ 

    public function user() 
    { 
     return $this->belongsTo('App\User', 'from'); 
    } 

    public function users() 
    { 
     return $this->belongsToMany('App\User')->withPivot('status'); 
    } 
} 

class User extends Eloquent { 

    public function messages() 
    { 
     return $this->hasMany('App\Message', 'from'); 
    } 

    public function receive_messages() { 
     return $this->belongsToMany('App\Message')->withPivot('status'); 
    } 
} 

が存在します:

update message_user 
set status = 1 
where user_id = 4 and message_id in (select id from messages where message_id = 123) 

このクエリはどのようにしてlaravelに相当するものに変換できますか?

+0

あなたは 'from'をどういう意味ですか? –

+0

外部キー@Mohamed –

+0

あなたの例では、2番目の引数が接続テーブル名です。** message ** user **モデルの**メッセージ**の合計の右の関係は、 'message_user'でなければなりません。return $ this- > hasMany( 'App \ Message \、' message_user '、' user_id '、' message_id ');' –

答えて

7

コードは、以下の解決私問題:

$messages = Message::where('message_id', $id)->get(); 
foreach($messages as $message) 
    $message->users()->updateExistingPivot($user, array('status' => 1), false); 
-1

ピボットテーブルを更新するには、updateExistingPivotメソッドを使用できます。

+0

ありがとう@Babar。私はどのように私のメソッドを使用する可能性がありますどのようなサンプルコードを追加することができます投稿にクエリを来る。 –

+0

ドキュメントはhttp://laravel.com/docs/5.0/eloquent#working-with-pivot-tablesにあります。 参照コードは、 です。ユーザー:: find(1) - > roles() - > updateExistingPivot($ roleId、$ attributes); –

3

あなたはこの2つの機能、sync()attach()のに使用することができますし、一言で言えば服従は、同期が(あなたの配列で渡されたキーを削除し、追加します)ピボットテーブルとその最初の引数として配列し、同期それを得るだろうということですつまり、接合テーブル内で3,2,1の値が得られ、3,4,2の値で同期を渡すと、自動的にsyncが値1を削除し、値4を追加します。どこ単一ID値になります取り付け

GIST:あなたは、あなたのジャンクションテーブルに余分な値を追加しますので、同じようSync()に2つ目の引数として渡したい場合

$message = Messages::where('id','123'); 
$user = User::where('id','4'); 

// using ->attach for single message 
$user->message()->attach($message->id,['status' => 1 ]); 



// using ->sync for multiple messages 
$message2 = Messages::where('id','456'); // for testing 
$user->message()->sync([$message->id =>['status' => 1 ],$message2->id =>['status' => 1 ] ]); 
+1

入力いただきありがとうございます@モハメド。同期は私のためのトリックをしなかった。 –

+0

@FokwaBestあなたのコメントに基づいて、あなたは多くの関係がほしいと思うので、あなたの雄弁な関係に間違いがあります。私が自分の答えを更新し、正しい関係を書くことができればそれで 'sync()'仕事:) –

+0

実際にユーザーがメッセージを作成すると、メッセージテーブルに格納されています。ピボットテーブルは、単にmessage_idと受信者($ user_id)のレコードを保持します。とにかくあなたのアプローチを見たいと思っています。 –

関連する問題