Laravel-多对多-模型绑定

Laravel-多对多-模型绑定,laravel,laravel-5.2,laravel-5.1,model-binding,Laravel,Laravel 5.2,Laravel 5.1,Model Binding,我需要一些帮助 我有以下表格:用户、购买和编解码器。我有一个多对多的关系:买,编解码器,买编解码器 表格 Schema::create('codecs', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); Schema::create('buys', function (Blueprint $

我需要一些帮助

我有以下表格:用户、购买和编解码器。我有一个多对多的关系:买,编解码器,买编解码器

表格

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'=>['UserBuyController@store', $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() !!}
  {!! 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() !!}

一种解决方案是为编解码器ID创建访问器,并将其与
Form::select()
一起使用:

在您的
购买
车型中添加以下访问者:

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>

{!!Form::label('codec_list','Outbound codec:')
{!!Form::select('codec_list[]',$codecs,null,['class'=>'Form-control','multiple'=>true])
这意味着,当您试图从请求中获取值时,必须使用
codec\u list
而不是
codec


希望这有帮助

在编辑表单中:
{!!form::select('codecs[]',$codecs,null,['class'=>'form-control','multiple'=>true])!!
默认选择值设置为
null
。您应该在此处设置相关编解码器的ID列表


希望这有帮助。

你能发布你的模型关系吗?嗨,@JanWillem。后更新。谢谢。什么不起作用,也就是说,你期待什么不会发生?你好,@RossWilson。我想在“编辑”页面上的下拉多选列表中自动选择选项,然后更新buy_编解码器透视表。这是我的透视表。寻找购买id 3。我有两个与此id相关的编解码器。这是我的编辑页面:我想你的问题应该有一个与刀片相关的标题,而不是多对多关系shipsthank you@RossWilson,现在它可以工作了。我也可以在编辑表单中不使用访问器使用它,如:{!!form::select('codecs',$codecs,$buy->codec->lists('id')->toArray(),['class'=>'form-control','multiple'=>'multiple'])!!。@confirm请注意自从Laravel 5.2以来,
lists
是不推荐的
pluck
是首选。我可以使用$buy->codec->lists('id')->toArray()而不是null,它可以正常工作。非常感谢。
<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>