首页 > 解决方案 > 根据 id 将表单中的数据插入到特定表中

问题描述

我在数据库名称主题中有一组数据,有 4 列 ['id'、'sub_name'、'sub_code'、'sub_group'。数据库的初始数据如下

+----+----------+----------+---------+
| id | sub_name | sub_code |sub_group|
+----+----------+----------+---------+
|  1 |     A    |   S01    |  0      |
+----+----------+----------+---------+
|  2 |     B    |   S02    |  0      |
+----+----------+----------+---------+
|  3 |     C    |   S03    |  0      |
+----+----------+----------+---------+


我尝试做的事情是通过表单将“sub_group”值更新为“group 1/group 2/group 3”,我尝试遵循一些教程但它失败了。以下是我尝试过的代码。希望有人可以帮助我..

这是我在 HomeController 中的代码

public function updateGroup(Request $request)
   {
       $group = Subject::find($request->subject_id);
       $group->sub_group = $request->sub_group;
       $group->save();

       return redirect('/dashboard');
   }

这是我在 Subject.php 模型中的代码

protected $fillable = [
        'sub_group'
    ];

这是我的代码

 <form method="post" action="/dashboard">
 {{ csrf_field() }}
  <table class="table table-hover">
   <thead class="text-warning" align="center">
     <th>No.</th>
     <th>Subject Name</th>
     <th>Subject Code</th>
     <th>Subject Group</th>
     </thead>
     <tbody>
     @foreach ($subject as $index => $sub)
      <tr align="center">
        <td>{{$index+1}}</td>
        <td>{{$sub->sub_name}}</td>
        <td>{{$sub->sub_code}}</td>
        <td>
          <div class="col">
              <select class="form-control" name="sub_group">
              <option disabled selected>Assign Group...</option>
              <option value="group1">Group 1</option>
              <option value="group2">Group 2</option>
              <option value="group3">Group 3</option>
              </select>
              <input type="hidden" name="subject_id" value="{{$sub->id}}">
          </div>
        </td>
      </tr>   
     @endforeach
     </tbody>
    </table>
    <button type="submit" class="btn btn-primary">Save</button>
   </form>

根据我的表格,用户只能填写“sub_group”的选项,我尝试用用户选择的最新值(“group1/2/3”)替换“sub_group”数据库​​中的现有值

这是我在 web.php 中的代码

Route::post('/dashboard', 'HomeController@updateGroup');

我希望当前的“sub_group”数据将使用用户从表单中选择的值进行更新。提前致谢 :)

标签: phplaravellaravel-5eloquent

解决方案


您正在使用一个 POST 更新多条记录。这意味着,您需要将关联数组发布到将 ID 映射到值的服务器,而不是发布单个 ID。

您可能还希望它<select>sub_group列中显示当前值。为此,我将按如下方式更新您的标记:

<select class="form-control" name="sub_group_{{ $sub->id }}">
  <option disabled{{ !($sub->sub_group) ? ' selected' : ''}}>Assign Group...</option>
  <option value="group1"{{ ($sub->sub_group == 'group1' ? ' selected' : '' }}>
    Group 1
  </option>
  <option value="group2"{{ ($sub->sub_group == 'group2' ? ' selected' : '' }}>
    Group 2
  </option>
  <option value="group3"{{ ($sub->sub_group == 'group3' ? ' selected' : '' }}>
    Group 3
  </option>
</select>

您的服务器将收到如下所示的数据:

[
  'sub_group_1' => 'group1',
  'sub_group_2' => 'group2',
  'sub_group_3' => 'group3'
]

现在,在您的控制器中,您需要从键中解析 ID,查找数据库记录并保存新值:

use Illuminate\Support\Str;

...


public function updateGroup(Request $request)
{
  foreach($request->all() as $key => $value) {
    if (Str::startsWith($key, 'sub_group_')) {
      $id = explode('_', $key)[2];
      $group = Subject::find($id);
      $group->sub_group = $value;
      $group->save();
    }
  }

  return redirect('/dashboard');
}

这是一个jsFiddle,您可以使用它来查看您的表单将提交给服务器的内容。


推荐阅读