首页 > 解决方案 > 从表中获取表单的 id 作为 Laravel 中下一个表单的参考

问题描述

我对 Laravel 很陌生。我目前正在做一个 Laravel 项目,一个人可以提交提案。我使用的 Laravel 版本是 Laravel Framework 8。我将提案表格分为 7 页。我在数据库中也有 7 个表。所以每一页的数据都会被保存到每一个表中。1 页 = 1 个表格。这意味着我也有 7 个模型。总之,我有 7 个视图、7 个控制器、7 个模型和 7 个表(如果这不是一个好的做法,请告诉我)

这是我的代码示例

路线

网页.php

Route::get('/form/details', [App\Http\Controllers\Lect\Form\Step1Controller::class, 'createStepOne'])->name('form.create.step.one');
Route::post('/form/details', [App\Http\Controllers\Lect\Form\Step1Controller::class, 'postCreateStepOne'])->name('form.create.step.one.post');
Route::get('/form/learning-outcomes', [App\Http\Controllers\Lect\Form\Step2Controller::class, 'createStepTwo'])->name('form.create.step.two');
Route::post('/form/learning-outcomes', [App\Http\Controllers\Lect\Form\Step2Controller::class, 'postCreateStepTwo'])->name('form.create.step.two.post');
...

模型

Step1.php

class Step1 extends Model {
    use HasFactory;
    public $table = 'forms';

    protected $fillable = [
        'title',
        'code',
        'creditvalue',
        'mqflevel',
        'affectedbatch',
        'kulliyyah',
        'department',
        'synopsis',
        'classification',
        'prerequisite',
    ];
}

Step2.php

class Step2 extends Model {
    use HasFactory;
    public $table = 'proposal_learning_outcome';
    public $timestamps = false;

    protected $fillable = [
        'proposal_id',
        'lo_id',
        'outcomes',
        'bloom_c',
        'bloom_a',
        'bloom_p',
        'ki',
        'po',
    ];
}

控制器

Step1Controller.php

class Step1Controller extends Controller {
    public function createStepOne(Request $request) {
        return view('form.step1');
    }

    public function postCreateStepOne(Request $request) {
        $validatedData = $request->validate([
            'title' => 'required',
            'code' => 'required|unique:forms',
            'creditvalue' => 'required|numeric',
            'mqflevel' => 'required|numeric',
            'affectedbatch' => 'required',
            'kulliyyah' => 'required',
            'department' => 'required',
            'synopsis' => 'required',
            'classification' => 'required',
            'prerequisite' => 'required',
        ]);

        $step1 = new Step1;
        $step1->title=$request->input('title');
        $step1->code=$request->input('code');
        $step1->creditvalue=$request->input('creditvalue');
        $step1->mqflevel=$request->input('mqflevel');
        $step1->affectedbatch=$request->input('affectedbatch');
        $step1->kulliyyah=$request->input('kulliyyah');
        $step1->department=$request->input('department');
        $step1->synopsis=$request->input('synopsis');
        $step1->classification=$request->input('classification');
        $step1->prerequisite=$request->input('prerequisite');
        $step1->created_by=Auth::user()->username;
        $result = $step1->save();

        return redirect()->route('form.create.step.two');
    }
}

Step2Controller.php

class Step2Controller extends Controller {
    public function createStepTwo(Request $request) {
        return view('form.step2');
    }

    public function postCreateStepTwo(Request $request) {
        $validatedData = $request->validate([
            'proposal_id' => 'required',
            'lo_id' => 'required',
            'outcomes' => 'required',
            'bloom_c' => 'required',
            'bloom_a' => 'required',
            'bloom_p' => 'required',
            'ki' => 'required',
            'po' => 'required',
        ]);

        foreach($request->lo_id as $key=>$lo_id) {
            $data = new Step2();
            $data->proposal_id=$request->input('proposal_id');
            $data->lo_id=$lo_id;
            $data->outcomes=$request->outcomes[$key];
            $data->bloom_c=$request->bloom_c[$key];
            $data->bloom_a=$request->bloom_a[$key];
            $data->bloom_p=$request->bloom_p[$key];
            $data->ki=$request->ki[$key];
            $data->po=$request->po[$key];
            $data->save();
        }

        return redirect()->route('form.create.step.three');
    }
}

看法

step1.blade.php

<form action="{{ route('form.create.step.one.post') }}" method="POST">
    @csrf
    <div class="card">
        Step 1: Basic Info 
    </div>
    <div class="card-body">
        @if ($errors->any())
                            <div class="alert alert-danger">
                                <ul>
                                    @foreach ($errors->all() as $error)
                                        <li>{{ $error }}</li>
                                    @endforeach
                                </ul>
                            </div>
                        @endif

                        <div class="form-group">
                            <label for="title">Course Title</label>
                            <input type="text" name="title" class="form-control text-lg" id="title" placeholder="">
                            </div>
                            <div class="row">
                            <div class="col-md-6">
                                <div class="form-group">
                                <label for="code">Course Code</label>
                                <input type="text" name="code" class="form-control text-lg" id="code" placeholder="">
                                </div>
                                <div class="form-group">
                                <label for="creditvalue">Credit Value</label>
                                <input type="number" name="creditvalue" class="form-control text-lg" id="creditvalue" placeholder="">
                                </div>
                            </div>

                            <div class="col-md-6">
                                <div class="form-group">
                                <label for="mqflevel">MQF Level</label>
                                <input type="number" name="mqflevel" class="form-control text-lg" id="mqflevel" placeholder="">
                                </div>
                                <div class="form-group">
                                <label for="affectedbatch">Affected Batch</label>
                                <input type="text" name="affectedbatch" class="form-control text-lg" id="affectedbatch" placeholder="">
                                </div>
                            </div>
                            </div>

                            <div class="form-group">
                            <label for="kulliyyah">Centre of Studies</label>
                            <select type="text" class="form-control text-lg" name="kulliyyah" id="kulliyyah">
                                <option value="Kulliyyah of Information and Communication Technology">Kulliyyah of Information and Communication Technology</option>
                                <option value="Kulliyyah of Education">Kulliyyah of Education</option>
                                <option value="Kulliyyah of Engineering">Kulliyyah of Engineering</option>
                                <option value="Kulliyyah of Architecture and Environmental Design">Kulliyyah of Architecture and Environmental Design</option>
                            </select>
                        </div>

                        <div class="form-group">
                            <label for="department">Department/Unit</label>
                            <select type="text" class="form-control text-lg" name="department" id="department">
                                <option value="Department of Computer Science">Department of Computer Science</option>
                                <option value="Department of Information System">Department of Information System</option>
                            </select>
                        </div>

                        <div class="form-group">
                            <label for="synopsis">Course Synopsis</label>
                            <textarea type="text" class="form-control text-lg" name="synopsis" rows="5" id="synopsis" placeholder=""></textarea>
                        </div>

                        <div class="form-group">
                            <label for="classification">Course Classification within the Curriculum</label>
                            <input type="text" class="form-control text-lg" name="classification" id="classification" placeholder="eg: CSC 1305">
                        </div>

                        <div class="form-group">
                            <label for="prerequisite">Prerequisite(s) (if any)</label>
                            <input type="text" class="form-control text-lg" name="prerequisite" id="prerequisite" placeholder="">
                        </div>

                    </div>
                    <div class="card-footer text-right">
                        <button type="submit" class="btn btn-primary">Next</button>
                    </div>
                </div>
            </form>

step2.blade.php

<form action="{{ route('form.create.step.two.post') }}" method="POST">
                @csrf
                <div class="card">
                    
                    Step 2: Course Learning Outcomes</div>

                    <div class="card-body">
                        @if ($errors->any())
                            <div class="alert alert-danger">
                                <ul>
                                    @foreach ($errors->all() as $error)
                                        <li>{{ $error }}</li>
                                    @endforeach
                                </ul>
                            </div>
                        @endif

                        <div class="form-group">
                            <label for="proposal_id">Proposal ID</label>
                            <input type="text" class="form-control text-lg" name="proposal_id" id="proposal_id" placeholder="">
                        </div> 


                        <div class="table-responsive">
                            <form method="post" id="dynamic_form">
                                <span id="result"></span>
                                <table class="table table-bordered" id="user_table">
                                    <thead>
                                        <tr class="table-active">
                                            <th rowspan="2">No.</th>
                                            <th rowspan="2" class="w-50">Outcomes</th>
                                            <th colspan="3" class="w-25">Bloom's Taxonomy</th>
                                            <th rowspan="2">Soft skills (KI)</th>
                                            <th rowspan="2">Programme Outcomes (PO)</th>
                                            <th rowspan="2"><a href="javascript:;" class="btn btn-info addRow">Add</a></th>
                                        </tr>
                                        <tr  class="table-active">
                                            <th>C</th>
                                            <th>A</th>
                                            <th>P</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                    <tr>
                                        <td><input class="form-control text-lg" name="lo_id[]"/></td>
                                        <td><textarea class="form-control text-lg" name="outcomes[]"></textarea></td>
                                        <td><input class="form-control text-lg" name="bloom_c[]"/></td>
                                        <td><input class="form-control text-lg" name="bloom_a[]"/></td>
                                        <td><input class="form-control text-lg" name="bloom_p[]"/></td>
                                        <td><input class="form-control text-lg" name="ki[]"/></td>
                                        <td><input class="form-control text-lg" name="po[]"/></td>
                                        <td><a href="javascript:;" class="btn btn-danger deleteRow">Remove</a></td>
                                    </tr>
                                    </tbody>
                                </table>
                            </form>
                        </div>

                    </div>
                    
                    <div class="card-footer">
                        <div class="row">
                            <div class="col-md-6 text-left">
                                <a href="{{ route('form.create.step.one') }}" class="btn btn-danger pull-right">Previous</a>
                            </div>
                            <div class="col-md-6 text-right">
                                <button type="submit" class="btn btn-primary ">Next</button>
                            </div>
                        </div>
                    </div>
                </div>
            </form>

其他5个步骤基本都是这样。

我当前的问题是如何获取第一个表单(step1)的proposal_id作为对接下来6个表单的引用。proposal_id 用作其他表的外键。proposal_id 在表中自动递增。

我把它们分成很多表格的原因是表格的某些部分是表格格式,如step2.blade.php所示。下面的图片作为参考。

表单示例

目前,正如您在代码中看到的那样,我当前的解决方案是在每个表单中手动输入proposal_id(这是不切实际的,因为他们一开始不知道proposal_id)。我当前的代码没有问题。它可以正常保存到数据库中。

我该如何解决这个问题?或者还有其他方法可以填写此表格吗?先感谢您。

标签: databaselaravelformslaravel-8

解决方案


你有两个解决方案,我看到的第一个是将proposal_id作为路由的参数传递(见下文)。

Route::get('/form/learning-outcomes{proposal_id}', [App\Http\Controllers\Lect\Form\Step2Controller::class, 'createStepTwo'])->name('form.create.step.two');

第二个是将它保存在您的会话变量中,您可以通过您的表单访问它


session()->put('proposal_id', $proposal_id)

要以第二种形式获取它,请使用:

session()->get('proposal_id')

更新 确保在迁移文件中添加这一行:

$table->id('proposal_id')

其中proposal_id 是您的主键自动增量。默认情况下,如果您没有将任何内容作为 id 参数,它将在您的列表中为 id。

$table->id()//COLUMN TABLE WILL CONTAINT id as name
$table->id('proposal_id')//COLMUN TABLE WILL CONTAINT proposal_id as name

推荐阅读