【问题标题】:Laravel - Many to Many - Model bindingLaravel - 多对多 - 模型绑定
【发布时间】:2016-10-26 15:55:38
【问题描述】:

我需要一些帮助。

我有这些表:用户、购买和编解码器。我有一个多对多的关系:buys、codecs、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'=>['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() !!}

模型绑定不起作用

出了点问题,但我不知道是什么。

这是我的数据透视表。我有 2 个与 buy_id 3

关联的编解码器

这是我的编辑页面。

未选择任何内容。


更新

型号

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');
    }
}

【问题讨论】:

  • 你能发布你的模特关系吗?
  • 嗨,@JanWillem。帖子更新了。谢谢。
  • 什么不起作用,即您期望什么不会发生?
  • 你好,@RossWilson。我想在编辑页面的下拉多选列表中自动选择选项,然后更新 buy_codec 数据透视表。这是我的数据透视表oi66.tinypic.com/2ronscl.jpg。查找 buy_id 3。我有 2 个与此 ID 关联的编解码器。这是我的编辑页面:oi67.tinypic.com/2ilnjn.jpg
  • 我想你的问题应该有一个与刀片相关的标题,而不是多对多关系

标签: laravel laravel-5.2 laravel-5.1 model-binding


【解决方案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

希望这会有所帮助!

【讨论】:

  • 谢谢@RossWilson,现在它正在工作。我也可以在没有访问器的情况下在编辑表单中使用它,如下所示:{!! Form::select('codecs', $codecs, $buy->codec->lists('id')->toArray(), ['class'=>'form-control', 'multiple'=>'multiple ']) !!}.
  • @confirm 请注意 lists 自 Laravel 5.2 起已被弃用。 pluck 是首选。
【解决方案2】:

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

希望这会有所帮助。

【讨论】:

  • 我可以使用 $buy->codec->lists('id')->toArray() 而不是 null 并且它正在工作。谢谢!
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
相关资源
最近更新 更多