Вставить данные из формы в конкретную таблицу на основе идентификатора - PullRequest
2 голосов
/ 01 октября 2019

У меня есть набор данных в именах субъектов базы данных с 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', и я пытаюсь заменить существующее значение в базе данных для 'sub_group' на последнее значение, выбранное пользователем('group1 / 2/3')

Это мой код в web.php

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

Я ожидаю, что текущие данные 'sub_group' будут обновлены на значение, выбранное пользователемиз формы. Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы обновляете несколько записей одним POST. Это означает, что вместо публикации одного идентификатора вам необходимо опубликовать ассоциативный массив на сервере, который сопоставляет идентификаторы со значениями.

Вы также, вероятно, хотите, чтобы <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'
]

Теперь, в вашем контроллере вам нужнопроанализируйте идентификатор ключа, найдите запись в базе данных и сохраните новое значение:

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 , который можно использовать, чтобы увидеть, что ваша форма будет отправлена ​​на сервер.

0 голосов
/ 01 октября 2019

Сначала дайте имя, чтобы выбрать

<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="{{$subject_id}}">

Обновление

На самом деле вам нужно передать $id в форме как скрытое поле ввода из-за сообщениязапрос. Тогда в функции контроллера вы получите subject_id от объекта запроса

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

       return redirect('/dashboard');
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...