2013-03-25 15 views
7

最近Laravel4で作業を開始しました。ピボットテーブルのデータを更新する際に、多少の関係がある場合に、いくつかの問題に直面しています。多対多リレーションの場合のピボットテーブルの更新laravel4

状況は次のとおりです。 私は2つのテーブルがあります。製品でProductTypeを。 それらの関係は多対多です。 私のモデルは

class Product extends Eloquent { 
    protected $table = 'products'; 
    protected $primaryKey = 'prd_id'; 

    public function tags() { 
     return $this->belongsToMany('Tag', 'prd_tags', 'prta_prd_id', 'prta_tag_id'); 
    } 
} 

class Tag extends Eloquent { 
    protected $table = 'tags'; 
    protected $primaryKey = 'tag_id'; 
     public function products() 
    { 
    return $this->belongsToMany('Product', 'prd_tags', 'prta_prd_id', 'prta_tag_id'); 
    } 
} 

あるピボットテーブルprd_tagsにデータを挿入している間、私がやった:

$product->tags()->attach($tag->tagID); 

をしかし、今、私は、このピボットテーブル内のデータを更新する、データを更新するための最良の方法は何ですかピボットテーブルに移動します。 たとえば、一部のタグを削除して特定の製品に新しいタグを追加したいとします。

+0

あなたが情報を読みましたドキュメント?助けてくれますか?http://four.laravel.com/docs/eloquent#working-with-pivot-tables –

+0

@PhillSparks:はい、私はこの文書を読んでいます。それぞれのidとinsertとdeleteの配列をとるが、私のピボットテーブルが両方のテーブルのid以外の属性を持っている場合は、これを行うsyncというメソッドがあります。 syncメソッドは、整数の配列ではなくオブジェクトの配列をとる必要があります。 – Sameer

+1

Eloquentは、ピボットテーブルにID列を使用して行を参照する単純なテーブルデザインを促進します。 Eloquentは、より包括的なORMソリューションが用意されているため、他のデータベース設計に対応するように設計されていませんでした。 –

答えて

5

私は、これは古い問題であることを知っていますが、まだ解決策に興味があるなら、ここにある:

は、あなたのピボットテーブルは、「foo」と追加属性としての「バー」を持っているとしましょう、

$product->tags()->attach($tag->tagID, array('foo' => 'some_value', 'bar'=>'some_other_value')); 
32

古い質問を、しかし、2013年11月13日に、updateExistingPivot方法は、多くの関係に多くのために公開されました:あなたは、そのテーブルにデータを挿入するには、この操作を行うことができます。これはまだ公式文書にはない。

public void updateExistingPivot(mixed $id, array $attributes, bool $touch) 

- テーブルの既存のピボットレコードを更新します。

2014年2月21日現在、3つの引数をすべて含める必要があります。あなたが行うことができ、あなたの場合は

、(あなたは、ピボットフィールド「foo」を更新したい場合):

$product->tags()->updateExistingPivot($tag->tagID, array('foo' => 'value'), false); 

それとも、親のタイムスタンプを触れないようにしたい場合はtrueに最後のブール虚偽を変更することができます。

プル要求:このため

https://github.com/laravel/framework/pull/2711/files

+2

すばらしい。私はこの方法を強調するために公式文書が更新されたことを願っています。これは正解とマークする必要があります。乾杯! –

+0

パーフェクト、ありがとう! – Guicara

+0

'public void'、typo? – haakym

4

別の方法laravel 5.0+

$tag = $product->tags()->find($tag_id); 
$tag->pivot->foo = "some value"; 
$tag->pivot->save(); 
+1

ピボットテーブルを保存するには '$ pivot-> pivot-> save();'を実行する必要があります。 – MECU

+0

これは実際に私が考える最も簡単な解決策です。 – dexterb

+0

このメソッドを使用すると、エラーが発生します: 'オーバーロードされたプロパティの間接的な変更は効果がありません – JackalopeZero

0

での作業中に、これは完全な例である:

$user = $this->model->find($userId); 
    $user->discounts() 
     ->wherePivot('discount_id', $discountId) 
     ->wherePivot('used_for_type', null) 
     ->updateExistingPivot($discountId, [ 
      'used_for_id' => $usedForId, 
      'used_for_type' => $usedForType, 
      'used_date_time' => Carbon::now()->toDateString(), 
     ], false); 
関連する問題