Флажок в foreach l oop in Laravel - PullRequest
       0

Флажок в foreach l oop in Laravel

3 голосов
/ 14 января 2020

У меня есть foreach l oop, в котором есть флажок. Я не уверен, как правильно получить это от флажка в форме до проверки в контроллере. В моем представлении есть следующее:

<table class="table">
  <thead>
    <tr>
      <th scope="col">Select</th>
    </tr>
  </thead>
  <tbody>
    @foreach($plans as $plan)
    <tr>
      <td>
        <input type='checkbox' name='Plan {{$plan->{'Plan ID'} }}' class='form-check-input' value='true'
          @if(old($plan->{'Plan ID'},$plan->{'Plan ID'})=="true") checked @endif>
      </td>
      <td> {{$plan->{'Plan ID'} }}</td>
      @endforeach
    </tr>
  </tbody>
</table>

В моем контроллере есть следующее:

$data = request()->validate ([
  'current' => '',
  'instructions' => '',
  'Plan 1' => '',
  'Plan 2' => '',
  'Plan 3' => '',
  'Plan 4' => '',
  'Plan 5' => '',
  'Plan 6' => '',
  'Plan 7' => '',
  'Plan 8' => '',
  'Plan 9' => '',
  'Plan 10' => '',
  'Plan 11' => '',
  'Plan 12' => '',
  'Plan 13' => '',
  'Plan 14' => '',
  'Plan 15' => '',
]);

$plansubmission = PlanSubmission::find($id);
//$plansubmission->update($data);

$designs = MedicalDesignsToQuote::find($id);

if($designs==null){
  $design = MedicalDesignsToQuote::create(['id'=>$id]);
  $design->update($data);
}
else{
  $designs->update($data);

Я не хочу использовать массив для атрибута 'name'

Добавлено это в контроллер:

$validator = Validator::make($request->all(), [
                    "list.*.id" => '', // Object exist validation 
                    "list.*.value" => '',
                    'current' => '',
                    'instructions' => '',
                ]);

$bodyContent = $request->getContent($validator);

$plansubmission = PlanSubmission::find($id);
// $plansubmission->update($data);

$designs = MedicalDesignsToQuote::find($id);

if($designs==null){
  $design = MedicalDesignsToQuote::create(['id'=>$id]);
  // $design->update($data);
  $design->update($validator);
}
else{
  $designs->update($validator);
}

В моей таблице есть следующие столбцы:

id
current
instructions
Plan 1
Plan 2
Plan 3
Plan 4
Plan 5
.....
Plan 50

Пользователь может выбрать любой или все 50 вариантов плана с помощью флажок. Например, если выбран план 5, значение для данной строки в таблице будет равно «Истина» для плана 5.

Итак, чтобы сохранить данные, я ожидал, что мне нужно сделать что-то вроде this:

$formData = $request->all();

foreach ($formData['list'] as $planData) {
  MedicalPlanDesignToQuote::updateOrCreate(
    [$planData['id']] => $planData['value']],
  );
}

Если бы у меня было два столбца с именами id и value, я полагаю, я мог бы сделать это:

foreach ($formData['list'] as $planData) {
  MedicalPlanDesignToQuote::updateOrCreate(
    ['id' => $planData['id']],
    ['value' => $planData['value']]
  );
}

Могу ли я в любом случае сделать это со своей структурой таблицы?

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Перво-наперво:

У вас есть ошибка в вашем примере. @endforeach необходимо переместить на один столбец вниз.

Секунда:

Вам необходимо понять, что именно вы здесь делаете. Вы имеете дело с отношением 1-n между каким-либо списком и элементами списка. Er go, вам нужно соответствующим образом построить ваше сообщение / получить тело.

Примером для одной строки таблицы может быть:

<tr>
  <td>
    <Input type="hidden" value="{{$plan->{'Plan ID'} }}" name="list[][id]">
    <Input type="checkbox" value="true" name="list[][value]">
  </td>
  <td>
    {{$plan->{'Plan ID'} }}
  </td>
</tr>

Теперь вы можете перебирать элементы соответственно , независимо от их идентификатора.

Теперь вы можете использовать проверку запроса, как указано здесь: https://laravel.com/docs/master/validation#validating -arrays

В нашем случае:

"list.*.id" => "...", // Object exist validation 
"list.*.value" => "..."

Теперь, как передать все объектам и сохранить их:

Вы должны знать, вы не можете просто передать что-либо в ваши объекты. Прямо сейчас вы проходите валидатор. Вместо этого используйте проверку только для проверки. Laravel позаботится о возврате ответа.

$this->validate($request, [
  'current' => required'',
  'instructions' => 'required',
  "list.*.id" => "required", // Object exist validation 
  "list.*.value" => "required"
]);

После этого вы получите данные из объекта запроса:

$formData = $request->all();

Мы сохранили нашу информацию в ключе 'list' ( см html). Таким образом, вы найдете его в вашем объекте запроса. В нашем списке хранится несколько «планов». Теперь вам нужно выполнить итерацию:

foreach ($formData['list'] as $planData) {
   Plan::updateOrCreate(
       ['id' => $planData['id']],
       ['value' => $planData['value']]
   );
}

Конечно, вам также нужно сохранять другие объекты / создавать отношения, если они есть.

Если вы хотите остаться со структурой таблицы (вы можете следует переделать это: ключевое слово BCNF), вы все еще можете / должны повторить:

$dataArray = [];

foreach ($formData['list'] as $planData) {
   $dataArray['Plan ' . $planData['id']] = $planData['value'];
}

$dataArray['current'] = $formData['current'];
$dataArray['instructions'] = $formData['instructions'];

// This way do not need to use create
$designs = MedicalDesignsToQuote::updateOrCreate(
    ['id' => $id],
    $dataArray
);

0 голосов
/ 24 января 2020

Вам необходимо создать группы параметров и таблицы параметров для обработки всех ваших списков.

Например, вам нужен список местоположений и список ресторанов.

Добавить родительский элемент списка местоположений в Option Group и дочернем в Option и присоедините их в Option. php для обработки всего вашего списка в будущем.

public static function getOfficeLocationList(){
    return Option::where('group_id', config('constants.OPT_GROUP_OFFICE_LOC'))->orderBy('name','ASC')->get();
}

В моем примере group_id - это идентификатор родительского списка, в этом способ, которым вы можете получить все опции местоположения, которые вы сохранили.

В вашем контроллере:

 $locationList = Option::getOfficeLocationList();

В вашем блейде:

@foreach($locationList as $item)
    your input checkbox with $item->name and $item->id
@endforeach

Вот и все: Бросьте данные формы в Ваша проверка:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...