gpt4 book ai didi

php - Laravel 7 - 数组到数据库(复选框)

转载 作者:行者123 更新时间:2023-12-04 08:59:04 24 4
gpt4 key购买 nike

我正在为医疗慈善机构创建仪表板。
我在 Laravel 7 中有一个多步表单设置。它分三步记录事件(因此使用 session())。
在第 2 步,它要求用户选择给药的药物。
药物来自数据库表(药物)并使用他们选中的内联复选框显示给用户。然后将其作为数组返回给 Controller 。
我的问题如下:

  • 如何通过 DrugUsed 模型将数组(由内联复选框生成)中的数据获取到 Drugs_used 数据库表中?

  • BLADE VIEW (addincident2.blade.php) [... 替换一些已删除的代码以使其更易于阅读]

    <form method="POST" action="{{ route('incident.doadd.2') }}">
    @csrf
    ...
    <div class="form-group row">
    <label for="incident_drugs" class="col-md-4 col-form-label text-md-right">{{ __('Drugs Used') }}</label>
    <div class="col-md-6">
    <div class="form-check">
    @foreach ($drugs as $drug)
    <label class="form-check-label">
    <input class="form-check-input @error('incident_drugs') is-invalid @enderror" name="drugs_used[]" type="checkbox" id="{{ $drug->drug_name }}" value="{{ $drug->drug_name }}">{{ $drug->drug_name }}
    </label></br >
    @endforeach
    </div>
    @error('incident_drugs')
    <span class="invalid-feedback" role="alert">
    <strong>{{ $message }}</strong>
    </span>
    @enderror
    </div>
    </div>
    ...
    </form>

    事件 Controller

        // NEW INCIDENT ADD METHOD
    public function AddIncidentPage1 (Request $request)
    {
    $request->session()->forget('incident');
    $request->session()->forget('drugused');
    $incident = $request->session()->get('incident');
    $drugused = $request->session()->get('drugused');
    $pagetitle = "Add an Incident";
    $incidenttypes = DB::table('incident_types')->pluck('incident_type');

    return view('incidents.addincident1', compact('pagetitle', 'incidenttypes', 'incident', 'drugused'));
    }

    public function DoAddIncident1 (Request $request)
    {
    $validatedData = $request->validate([
    'incident_date' => 'required|date',
    'incident_number' => 'required|numeric|digits:8',
    'incident_location' => 'required|alpha_num|min:2|max:4',
    'incident_type' => 'required',
    'incident_desc' => 'required',
    'incident_duration' => 'required',
    'incident_work' => 'boolean',
    'incident_mileage' => 'numeric',
    'incident_case_review' => 'boolean',
    'incident_sd' => 'boolean',
    ]);

    $incident = new Incident();
    $incident->fill($validatedData);
    $request->session()->put('incident', $incident);

    if($validatedData['incident_sd'] == 0)
    {
    return redirect('/incidents/add/2');
    }
    elseif($validatedData['incident_case_review'] == 1)
    {
    return redirect('/incidents/add/3');
    }
    else
    {
    $incident = $request->session()->get('incident');
    $incident->fill($validatedData);
    $incident->incident_userid = Auth::user()->esr_number;
    $incident->save();
    return redirect()->intended('/incidents')->with('success','Incident created successfully!');
    }
    }

    public function AddIncidentPage2 (Request $request)
    {
    $incident = $request->session()->get('incident');
    $drugused = $request->session()->get('drugused');
    $drugs = Drug::all();

    $pagetitle = "Add an Incident";

    return view('incidents.addincident2', compact('pagetitle', 'incident', 'drugs', 'drugused'));
    }

    public function DoAddIncident2 (Request $request)
    {
    $validatedData = $request->validate([
    'incident_fos' => 'boolean',
    ]);
    $incident = $request->session()->get('incident');
    $incident->fill($validatedData);
    $request->session()->put('incident', $incident);


    if($incident['incident_case_review'] == 1)
    {
    return redirect('/incidents/add/3');
    }
    else
    {
    $incident->incident_userid = Auth::user()->esr_number;
    $incident->save();
    return redirect()->intended('/incidents')->with('success','Incident created successfully!');
    }
    }

    public function AddIncidentPage3 (Request $request)
    {
    $incident = $request->session()->get('incident');
    $drugused = $request->session()->get('drugused');

    $pagetitle = "Add an Incident";

    return view('incidents.addincident3', compact('pagetitle', 'incident', 'drugused'));
    }

    public function DoAddIncident3 (Request $request)
    {
    $validatedData = $request->validate([
    'incident_review_notes' => 'required_if:incident_case_review,1',
    ]);

    $incident = $request->session()->get('incident');
    $incident->fill($validatedData);
    $incident->incident_userid = Auth::user()->esr_number;
    $incident->save();
    $request->session()->forget('incident');


    return redirect()->intended('/incidents')->with('success','Incident created successfully!');
    }

    最佳答案

    不要使用药物名称作为复选框的 ID(或 value=""字段)。使用唯一的数据库 ID。
    当您命名以 [] 结尾的 html 字段时,PHP 会将其设为数组。

        $user = $reqest->user();
    //is user related to drugs via drugs used?

    $drugsSubmitted = $request->input('drugs-used');
    $drugsSubmitted->each(function($item) use ($user) {
    $loadedDrug = \App\Models\Drug::find($item); //because it is a list of IDs from HTML POST
    $user->drugs()->associate($loadedDrug);
    });
    $user->drugs()->save();
    但这并没有消除任何以前的关系。我们希望提交的内容是所用药物的最终 list 。因此,我们必须在调用 $model->relation()->associate( $modelB ) 之前清除该用户的现有关系。
    您可以使用 $model->relation()->sync( $arrayOfIds ) sync 方法在 1 次调用中保存相关 ID 的绝对列表。
    用户和所有可能的药物之间通过 DrugsUsed 表的关系可以这样实现:

    class User {
    public function drugs() {
    return $this->belongsToMany('App\Models\Drug');
    //optionally you can specify the table which holds the many-to-many ids
    // return $this->belongsToMany('App\Models\Drug', 'user_drug_rel');
    }
    }

    (您需要通过迁移自己创建多对多表)
    php artisan make:migration create_user_drug_relation_table
    public function up()
    {
    Schema::create('user_drug_rel', function($table) {
    $table->increments('id');
    $table->integer('user_id');
    $table->integer('drug_id');
    $table->timestamps();
    });
    }
    在描述了保存多对多关系的“标​​准”方法 ( https://laravel.com/docs/6.x/eloquent-relationships ) 之后,我不会将数据保存限制为仅一种方法。
    当有人处理临床数据时,我通常会跳到 EAV 建模,因为数据可能会在研究的生命周期内发生变化。哪些药物可用,哪些可能会或可能不会被选择可能会改变。他们可能会在 6 个月后再次问同样的问题。
    我会根据它们的 ID(如第一个 each 循环)从数据库加载所有药物,并将药物名称、ID、日期和许多其他内容保存到一个 json blob 中并存储它在像 user_form_submissions 这样的表中.这样,如果有人回击并更改复选框并再次提交,您将有一个不断增加的(仅附加)日志记录何时提交。
    现在我已经阅读了您的事件 Controller 。我肯定会在该表中添加一个 json blob 列,然后遍历提交的药物 ID 并创建一个数组数组。
    此外,您可以创建一个事件并将 ID 作为隐藏输入类型放入表单中,而不是尝试在 session 中传递对象/ID。

    //Incident controller

    public function doSavePage1(Request $req) {
    //validate
    $i = Incident::create([
    'attribute' => $request->input('attribute'),
    // etc...
    ]);

    return view('step.2.template', [
    'incident_id' => $i->id,
    ]);
    }


    public function doSavePage2(Request $req) {
    $i = Incident::find($request->input('incident_id'));
    if($i ==null) {
    return response()->back();
    }
    }

    关于php - Laravel 7 - 数组到数据库(复选框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63647237/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com