【问题标题】:how can I add multiple rows in database from a single form?如何从单个表单在数据库中添加多行?
【发布时间】:2019-02-07 01:50:05
【问题描述】:

我正在使用 Laravel 设置一个名册 Web 应用程序,我需要一个表单来输入所有字段,然后将它们存储到数据库中,当我使用 tinker 或提交单行时一切正常,但是当我尝试提交整个表单时,只读取最后一行。

这是rota.blade.php 文件

{!! Form::open(['action' => 'RotaController@store', 'method' => 'POST', 'enctype' => 'multipart/form-data']) !!}

<table class="table table-striped table-bordered">
    <thead class="thead-dark">
        <tr>
            <th scope="row">Name</th>
            <th scope="row">Sunday</th>
            <th scope="row">Monday</th>
            <th scope="row">Tuesday</th>
            <th scope="row">Wednesday</th>
            <th scope="row">Thursday</th>
            <th scope="row">Friday</th>
            <th scope="row">Saturday</th>
        </tr>
    </thead>
    <tbody>
    <!--
        * create a loop to iterate through each instance in the weekly rota database
        * and create a row for each one; in case the username coincides with the name in the rota
        * add class="active" to each row, so it is easier for the user to identify its own row
    -->
        @csrf
        @foreach ($users as $user)
            <tr>
                <th scope="row">
                    {{$user->first_name}}
                    <input name="user_id" type="hidden" value="{{$user->id}}">
                    <input name="week_no" type="hidden" value="{{$currWeek}}">
                </th>
                <th scope="row">
                    {{Form::text('sunday', '', ['class' => 'form-control'])}}
                </th>
                <th scope="row">
                    {{Form::text('monday', '', ['class' => 'form-control'])}}
                </th>
                <th scope="row">
                    {{Form::text('tuesday', '', ['class' => 'form-control'])}}
                </th>
                <th scope="row">
                    {{Form::text('wednesday', '', ['class' => 'form-control'])}}
                </th>
                <th scope="row">
                    {{Form::text('thursday', '', ['class' => 'form-control'])}}
                </th>
                <th scope="row">
                    {{Form::text('friday', '', ['class' => 'form-control'])}}
                </th>
                <th scope="row">
                    {{Form::text('saturday', '', ['class' => 'form-control'])}}
                </th>   
            </tr>
        @endforeach
    {{Form::submit('Submit', ['class' => 'btn btn-primary'])}}
</tbody>

</table>    
{!! Form::close() !!}

这是RotaController@store:

public function store(Request $request)
{
     //validation
     $this->validate($request,[
        'user_id' => 'required',
        'sunday' => 'required',
        'monday'=> 'required',
        'tuesday'=> 'required',
        'wednesday'=> 'required',
        'thursday'=> 'required',
        'friday'=> 'required',
        'saturday'=> 'required',
        'week_no'=> 'required'
    ]);

    //create a field
    $rota = new Rota;
    $rota->user_id = $request->input('user_id');
    $rota->week_no = $request->input('week_no');
    $rota->sunday = $request->input('sunday');
    $rota->monday = $request->input('monday');
    $rota->tuesday = $request->input('tuesday');
    $rota->wednesday = $request->input('wednesday');
    $rota->thursday = $request->input('thursday');
    $rota->friday = $request->input('friday');
    $rota->saturday = $request->input('saturday');
    $rota->save();

    $users = DB::table('users')->orderBy('first_name', 'asc')->get();
    return view('admin.admin-rota')->with('users', $users);

}

我试过dd($request),它实际上只得到最后一组输入字段, 我想我必须遍历它们,但我不知道如何。有人对尝试什么有任何建议吗?非常感谢您的任何反馈,我对使用这个框架还是很陌生。

【问题讨论】:

  • 看起来每一行的输入名称都相同。尝试使用用户 ID 使它们独一无二。

标签: laravel laravel-5.7


【解决方案1】:

我会按用户对表单数据进行分组。

    @foreach ($users as $user)
                <tr>
                    <th scope="row">
                        {{$user->first_name}}
                        <input name="users[{{$user->id}}][id]" type="hidden" value="{{$user->id}}">
                        <input name="users[{{$user->id}}][week_no]" type="hidden" value="{{$currWeek}}">
                    </th>
                    <th scope="row">
                        {{Form::text("users[$user->id][sunday]", '', ['class' => 'form-control'])}}
<th scope="row">
                        {{Form::text("users[$user->id][monday]", '', ['class' => 'form-control'])}}

                </tr>
            @endforeach
        {{Form::submit('Submit', ['class' => 'btn btn-primary'])}}
    </tbody>

在控制器中,您将拥有包含每个用户数据的数组。 那么你的控制器可能看起来像这样:

 public function store(Request $request)
{
     //validation
     $this->validate($request,[
        'users.*.user_id' => 'required',
        'users.*.sunday' => 'required',
        ...
    ]);
    foreach($request->get('users') as $userData){
       $rota = new Rota;
       $rota->user_id = $userData['user_id'];
       $rota->week_no = $userData['week_no'];
       $rota->sunday = $userData['sunday'];
       ...
       $rota->save();
    }
    //create a field


    $users = DB::table('users')->orderBy('first_name', 'asc')->get();
    return view('admin.admin-rota')->with('users', $users);
}

【讨论】:

  • 谢谢这个工作正常,唯一的问题是由于某种原因它不允许我在 Form:: 类中添加诸如 $user->id 之类的变量,我通过将其更改为正常的 字段,所以没问题,但我想知道你是否知道为什么会发生这种情况。
【解决方案2】:

您可以为每个输入的名称附加一个索引,并保留一个隐藏的输入来存储集合计数。

@php
    $idx = 0;
@endphp

@foreach ($users as $user)
<tr>
    <th scope="row">
        {{$user->first_name}}
        <input name="user_id_{{$idx}}" type="hidden" value="{{$user->id}}">
        <input name="week_no_{{$idx}}" type="hidden" value="{{$currWeek}}">
    </th>
    <th scope="row">
        {{Form::text('sunday_' . $idx , '', ['class' => 'form-control'])}}
    </th>
    <th scope="row">
        {{Form::text('monday_' . $idx, '', ['class' => 'form-control'])}}
    </th>
    <th scope="row">
        {{Form::text('tuesday_' . $idx, '', ['class' => 'form-control'])}}
    </th>
    <th scope="row">
        {{Form::text('wednesday_' . $idx, '', ['class' => 'form-control'])}}
    </th>
    <th scope="row">
        {{Form::text('thursday_' . $idx, '', ['class' => 'form-control'])}}
    </th>
    <th scope="row">
        {{Form::text('friday_' . $idx, '', ['class' => 'form-control'])}}
    </th>
    <th scope="row">
        {{Form::text('saturday_' . $idx, '', ['class' => 'form-control'])}}
    </th>   

    @php 
        $idx++;
    @endphp
</tr>
@endforeach
{{-- holds numbers of users count --}}
<input type="hidden" name="user_count" value="{{$users->count()}}"> 

在控制器中,循环遍历我们从刀片文件中获得的用户使用变量$user_count 的数量。每个数据变量都有附加的索引,然后您可以对应从刀片文件中输入的正确数据。请注意,这里的验证是在每次迭代时对每个对象进行的。如果您想在保存前VALIDATE ALL数据,请在保存数据前使用 validate 再创建一个foreach

for ($i=0; $i < $request->user_count; $i++) { 
       //validation
    $this->validate($request,[
        'user_id_' . $i => 'required',
        'sunday_' . $i => 'required',
        'monday_'  . $i=> 'required',
        'tuesday_'  . $i => 'required',
        'wednesday_'  . $i=> 'required',
        'thursday_'  . $i => 'required',
        'friday_'  . $i=> 'required',
        'saturday_' . $i=> 'required',
        'week_no_' . $i=> 'required'
    ]);

    //create a field
    $rota = new Rota;
    $rota->user_id_{$i} = $request->input('user_id_' . $i);
    $rota->week_no_{$i} = $request->input('week_no_' . $i);
    $rota->sunday_{$i} = $request->input('sunday_' . $i);
    $rota->monday_{$i} = $request->input('monday_' . $i);
    $rota->tuesday_{$i} = $request->input('tuesday_' . $i);
    $rota->wednesday_{$i} = $request->input('wednesday_' . $i);
    $rota->thursday_{$i} = $request->input('thursday_' . $i);
    $rota->friday_{$i} = $request->input('friday_' . $i);
    $rota->saturday_{$i} = $request->input('saturday_' . $i);
    $rota->save();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多