2016-10-20 3 views
1

私はいくつかの助けが必要です。Laravel - 作成とアタッチ - 多対多の関係

私はこれらのテーブルを持っています:ユーザ、購入、コーデック。私は、多対多の関係を持っている:買物、コーデック、

buy_codecテーブル

Schema::create('codecs', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->timestamps(); 
}); 

Schema::create('buys', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('user_id')->unsigned(); 
    $table->string('name'); 
}); 

Schema::create('buy_codec', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('buy_id')->unsigned(); 
    $table->foreign('buy_id')->references('id')->on('buys')->onDelete('cascade'); 

    $table->integer('codec_id')->unsigned(); 
    $table->foreign('codec_id')->references('id')->on('codecs')->onDelete('cascade'); 

    $table->timestamps(); 
});  

モデル

class Codec extends Model 
{ 
    protected $guarded = ['id']; 
    public function buy() { 
     return $this->belongsToMany('App\Buy'); 
    } 
} 

class Buy extends Model 
{ 
    protected $guarded = ['id']; 
    public function codec() { 
     return $this->belongsToMany('App\Codec'); 
    } 
} 

class User extends Authenticatable 
{ 
    public function buy() { 
     return $this->hasMany('App\Buy'); 
    } 
} 

は私が買うテーブルを移入したいですuser_idでコーデックを添付し、コーデックテーブル。

これはを購入してを作成するフォームです。

{!! Form::open(['method'=>'POST', 'action'=>['[email protected]', $usr->id]]) !!} 

    <div class="form-group"> 
     {!! Form::label('name', 'Name:') !!} 
     <div class="input-group"> 
      <span class="input-group-addon"><i class="fa fa-font"></i></span> 
      {!! Form::text('name', null, ['class'=>'form-control']) !!} 
     </div> 
    </div> 

    <div class="form-group"> 
     {!! Form::label('codecs', 'Outbound Codecs:') !!} 
     <div class="input-group"> 
      <span class="input-group-addon"><i class="fa fa-language"></i></span> 
      {!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!} 
     </div> 
    </div> 

    {!! Form::submit('Submit', ['class'=>'btn btn-info']) !!} 

{!! Form::close() !!} 

コーデックを添付しないとすべて正常に動作します。

UserBuyController

​​

がどのように私は買いレコードを作成することができます(私は買いIDを必要とするため)と比べて、ピボットテーブルのコーデックを添付?

ありがとうございます!

答えて

2

モデルでは、中間テーブルについて言及する必要があります。

class Codec extends Model 
{ 
    protected $guarded = ['id']; 
    public function buy() { 
     return $this->belongsToMany('App\Buy', 'buy_codec', 'codec_id', 'buy_id'); 
    } 
} 

class Buy extends Model 
{ 
    protected $guarded = ['id']; 
    public function codec() { 
     return $this->belongsToMany('App\Codec', 'buy_codec', 'buy_id', 'codec_id'); 
    } 
} 

そして

public function store($userId, Request $request) 
{ 
     $buy = User::findOrFail($userId)->buy()->create($request->all()); 
     $buy->codec()->attach([codec_ids]); 
     return view('buy.index'); 
} 

、コントローラには、メソッドを添付して使用して、よりコーデックオブジェクトまたはIDを添付することができます。

あなたがこれを達成することができ、いくつかの方法があります

https://laravel.com/docs/5.2/eloquent-relationships#inserting-related-models

+0

今ではこれらの作業です: – confm

+0

http://pastebin.com/5usuutCS – confm

+0

どのように私は今デ・モデルを結合できますか? – confm

1

このリンクを参照してください。 attach()またはsync()とすることができます。私はいつもattach()機能のピボットデータを保存します。

$usr = User::findOrFail($userId)->create($request->all()); 
$usr->buy()->attach($request->codecs); 

または、クエリをインライン化することができます

$usr = User::findOrFail($userId)->create($request->all())->buy()->attach($request->codecs); 
1

あなたは()または同期()を添付することができます。私は常にピボットデータをattach()関数で保存します。

$buy = Buy::findOrFail($id); 
    $buyId = $request->input('codec'); 
    $buy->codec()->attach($buyId);