2016-10-25 67 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() !!} 

和thi 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() !!} 

模型綁定不起作用

有些事情不對,但我不知道是什麼。

這是我的數據透視表。我曾與相關的編解碼器2 3 buy_id

enter image description here

這是我的編輯頁面。

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-> lists('id') - > toArray(),['class'=>'form-control','multiple'=>'multiple '])!!}。 – confm

+0

@confirm請注意,自Laravel 5.2開始,「列表」已被棄用。 「拔」是首選。 –

+0

哦,再次感謝! – confm

1

在編輯窗體中:{!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!}默認的選定值設置爲null。您應該在此設置關聯編解碼器的ID列表。

希望這會有所幫助。

+0

而不是null我可以使用$ buy-> codec-> lists('id') - > toArray()並且它正在工作。謝謝! – confm