Laravel Pivot表的问题

时间:2018-04-13 17:16:50

标签: laravel

我正在laravel的医学实验室应用程序中,我有以下表格:
1.测试表:这是一个存储与医学测试有关的所有信息的表:
2:体检:这是一个页面,其中包含所有患者信息以及他/她所进行的测试。

这是测试页面:
enter image description here

这是检查页面,其中选择了测试及其结果:
enter image description here

这可以是许多测试,用户可以检查任意数量的测试,并将测试结果写在复选框下面的文本字段中。
我在控制器中得到这些数据,如下面的代码,并将其保存到数据库中:

$this->validate($request, 
    [

        'patient_name' => 'required|max:50',
        'patient_age' => 'required',
        'gender' => 'required',
        'patient_type' => 'required',
        'technition_id' => 'required',
        'result' => 'required',
        'test' => 'required',
        'amount' => 'required'


    ]);

    if( ($request->patient_type == 2) && ($request->doctor_id==0) )
    {
        return redirect()->back()->withInput(Input::all())->withErrors(['message' => 'Please select a valid Doctor.']);
    }

    $checkup = new Checkup;
    $checkup->patient_name = $request->patient_name;
    $checkup->patient_age = $request->patient_age;
    $checkup->gender = $request->gender;
    $checkup->patienttype_id = $request->patient_type;
    $checkup->technition_id = $request->technition_id;
    if(isset($request->doctor_id))
    {
        $checkup->doctor_id = $request->doctor_id;
    }
    $checkup->amount = $request->amount;
   // $checkup->result = $request->result;
    $checkup->save();

    $tests =[];
    $tests = $request->test;
    $results =[];
    $results = $request->result;

       //$checkup->tests()->attach($tests->id, ['result' => $result]);

       $sync_data = [];
        for($i = 0; $i < count($tests); $i++)
            $sync_data[$tests[$i]] = ['result' => $results[$i]];

        $checkup->tests()->sync($sync_data);




    Session::flash('success', 'The record was successfully saved.');

    return redirect()->route('checkups.index');

现在的问题是,当我检查所有复选框并写下所有测试的结果然后它很好但是当我选择一些并留下其中一些然后它给出错误并且错误来了,因为结果文本框为未经检查的测试是空的。

当我选择一个测试并离开其他测试时就是这种情况:

enter image description here

当我检查测试并写出结果然后var_dump测试和结果数组时,我得到以下输出:

enter image description here

在上面的图像中,我们可以看到测试数组包含一个项目,因为只检查了一个复选框,但结果数组包含两个项目,第一个是NULL,属于未选中的复选框。

这是复选框和文本字段的视图文件:

{{ Form::label('tests', 'Tests Taken') }}

    @foreach(App\Test::all() as $test)

        <div class="checkbox checkbox-switchery">
            {{ Form::label('test', $test->name) }}
            <input name="test[]" value="{{ $test->id }}" type="checkbox" class="switchery-primary">

        </div>

        <div>
            {{ Form::label('result', "Result") }}
            <input name="result[]" type="text" class="form-control">
        </div>

    @endforeach

    <div class="form-group">
        {{ Form::label('amount', 'Amount') }}
        {{ Form::text('amount', null, ['class' => 'form-control']) }}
    </div>

    <div class="form-group">
        {{Form::button('<i class="fa fa-save"> Save</i>', ['type' => 'submit', 'class' => 'btn btn-success'])}}

    </div>

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

请帮我解释一下,并告诉我如何将数据透视表数据正确插入系统。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

试试这个..

在您的刀片文件中:

    @foreach(App\Test::all() as $index => $test)

        <div class="checkbox checkbox-switchery">
            {{ Form::label('test', $test->name) }}
            <input name="test[{{ $index }}]" value="{{ $test->id }}" type="checkbox" class="switchery-primary">

        </div>

        <div>
            {{ Form::label('result', "Result") }}
            <input name="result[{{ $index }}]" type="text" class="form-control">
        </div>

    @endforeach

您可以使用for lopp。

代替foreach循环
    $sync_data = [];

    foreach($tests as $index => $value) {
        if(!empty($results[$index]) {
            $sync_data[$value] = ['result' => $results[$index]]
        }
    }

    $checkup->tests()->sync($sync_data);