2016-10-25 17 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 UserBuyController extends Controller 
{ 
    public function create($userId) 
    { 
     $codecs = Codec::lists('name', 'id'); 
     $usr = User::findOrFail($userId); 
     return view('buy.create', compact('usr', 'codecs')); 
    } 

    public function store($userId, Request $request) 
    { 
     $codecs = $request->input('codecs'); 
     $usr = User::findOrFail($userId)->buy()->create($request->except('codecs')); 
     $usr->codec()->sync($codecs); 
     return redirect('user/'.$userId.'/buy'); 
    } 

    public function edit($userId, $id) 
    { 
     $codecs = Codec::lists('name', 'id'); 
     $buy = User::findOrFail($userId)->buy()->findOrFail($id); 
     return view('buy.edit', compact('buy', 'codecs')); 
    } 
} 

フォーム

{!! 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() !!} 
を作成します。

そして、 sが編集フォーム

{!! Form::model($buy,['url'=>url('user/'.$buy->user->id.'/buy/'.$buy->id),'method'=>'patch']) !!} 

    <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('Update', ['class'=>'btn btn-info']) !!} 

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

ある結合モデルは

何かが間違っているが、私は何を知っていないと動作しません。

これは私のピボットテーブルです。私はbuy_id 3

enter image description here

に関連した2つのコーデックを持っており、これは私の編集ページです。

enter image description here

何も選択されていません。


更新

モデル

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

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

モデル関係を投稿できますか? –

+0

こんにちは、@JanWillem。投稿が更新されました。ありがとう。 – confm

+0

動作していないもの、つまり何が起こっていないと思われますか? –

答えて

1

一つの解決策は、コーデックIDのアクセサを作成して使用することであろうその代わりForm::select()と:

あなたBuyでモデルは次のアクセサを追加します:

public function getCodecListAttribute() 
{ 
    return $this->codecs->pluck('id')->toArray(); 
} 

その後にあなたの選択ブロックを変更:

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

これは、あなたがリクエストから値を取得しようとすると、codec_list代わりのcodecsを使用する必要がありますことを意味します。

希望すると便利です。

+0

ありがとうございます@RossWilson、今それは働いています。私はアクセサリーなしで、次のような編集フォームでそれを使うこともできます:{!! Form :: select( 'codecs'、$ codecs、$ buy-> codec-> list( 'id') - > toArray()、['class' => 'form-control'、 'multiple' => 'multiple ']))}。 – confm

+0

@confirm Laravel 5.2以降、 'lists'は推奨されていません。 'pluck'が優先されます。 –

+0

ああ、ありがとう! – confm

1

編集フォーム:{!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!}デフォルトの選択値はnullと設定されています。関連するコーデックのIDリストをここに設定する必要があります。

これが役に立ちます。

+0

nullの代わりに私は$ buy-> codec-> list( 'id') - > toArray()を使うことができます。ありがとうございました! – confm