首页 > 解决方案 > Laravel 6 one-->资源控制器中的多关系

问题描述

我目前有一个应用程序,它可以有一个带有许多选项的修饰符。一个示例用例是带有奶酪、生菜、盐和胡椒选项的 Toppings 修饰符。一个修饰符可以有 1 --> N 个选项。

我想要一个显示Modifier名称并允许同时编辑/删除Option记录的表单。我想将其嵌入到我当前的表单中以添加/编辑修饰符。

有没有一种简单的方法可以做到这一点,这样我就可以只有一个同时管理选项的修改器资源控制器?

网页.php

Route::resource('modifiers', 'ModifierController')->middleware('auth');

控制器:

namespace App\Http\Controllers;
use App\Modifier;
use Illuminate\Http\Request;

class ModifierController extends Controller
{

    public function create()
    {
            $data = ['action' => route('modifiers.store'),'method' => 'POST', 'modifier' => new Modifier()];
      return view('modifiers.form',$data);
    }

    public function store(Request $request)
    {
            $modifier = new Modifier($request->all());
            $this->do_validate($request);
            $modifier->save();
            return redirect(route('modifiers.index'));
    }           
}

视图/修饰符/form.blade.php

@extends('layouts.layout-2')

@section('content')

<div class="container">
    <div class="row justify-content-center">

            @include ('layouts.errors')

        <div class="col-md-12">

                    {!! Form::open(['url' => $action, 'method' => 'post', 'class' => 'form', 'id' => 'form'])!!}                                    
                    @csrf
                    @method($method)

                    <div class="form-group">
                        <label for="name">{{ __('modifiers.name')}}</label>
                        <input type="text" class="form-control" id="name" name="name" value = "{{old('name',$modifier->name)}}">
                     </div>



                  <button id="btnSubmit" class="btn btn-primary">{{ __('common.submit') }}</button>

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

        </div>
    </div>
</div>
@endsection

楷模:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Modifier extends Model
{
    use SoftDeletes;
    protected $guarded = ['id'];    

    public function options()
    {
        return $this->hasMany('App\Option');
    }       
}

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Option extends Model
{
    use SoftDeletes;
    protected $guarded = ['id'];

    public function modifier()
    {
        return $this->belongsTo('App\Modifier');
    }

}

标签: phplaraveleloquent

解决方案


我认为你可以使用一个select元素:

<select name="options[]" id="options" class="form-control">
    @foreach($options as $option)
        <option value="{{ $option->id }}" {{ $modifier->options->contains('id', $option->id) ? 'selected' : '' }}>{{ $option->name }}</option>
    @endforeach
</select>

希望能帮助到你。

然后,在某个控制器中:

public function update(Request $request, $id)
{
    $modifier = Modifier::find($id);
    $modifier->options()->sync($request->input('options'));

    // Do whatever more you want to do

}

推荐阅读