2016-10-25 8 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 кодеки, связанные с buy_id 3

enter image description here

И это моя страница редактирования. не выбран

enter image description here

Ничто.


Update

Модель

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

Одним из решений могло бы стать создание аксессора для кодека идентификаторами и использовать его с 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, теперь он работает. Я также могу использовать его без аксессуаров в форме редактирования, например: {!! Форма :: select ('codecs', $ codecs, $ buy-> codec-> lists ('id') -> toArray(), ['class' => 'form-control', 'multiple' => 'multiple ']) !!}. – confm

+0

@confirm Просто имейте в виду, что 'lists' устарел с Laravel 5.2. 'pluck' является предпочтительным. –

+0

О, еще раз спасибо! – confm

1

в форме редактирования: {!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!} выбранное по умолчанию значение установлено как null. Здесь вы должны указать список идентификаторов связанных кодеков.

Надеюсь, это поможет.

+0

Вместо null я могу использовать $ buy-> codec-> lists ('id') -> toArray(), и он работает. Спасибо! – confm