【问题标题】:Checkbox in foreach loop in LaravelLaravel foreach 循环中的复选框
【发布时间】:2020-05-01 05:12:15
【问题描述】:

我有一个 foreach 循环,其中有一个复选框。我不确定如何正确地从表单中的复选框到控制器中的验证。我的看法如下:

<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 将是“真”。

所以,要持久化数据,我希望我需要做这样的事情:

$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']]
  );
}

无论如何我可以用我的表结构做到这一点吗?

【问题讨论】:

  • 您需要什么验证,至少要选择一个?
  • 您的计划栏的名称是什么?现在看来你有一个空间。
  • 计划列名是Plan 1, Plan 2, Plan 3.....Plan 15
  • 我认为如果你将 Plan 1、Plan 2 Plan 3 移动到数组 plans =&gt; [0 =&gt; data, 1 =&gt; data] 中,你将有更简单的方法来循环它们。如果您不希望计划包含超过 15 个项目,您可以使用 'array|max:15' 验证计划。

标签: laravel


【解决方案1】:

第一件事:

您的示例中有错误。 @endforeach 需要向下移动一列。

第二:

您需要了解,您在这里到底在做什么。您处理某种列表和列表项之间的 1-n 关系。因此,您需要相应地构建您的帖子/获取正文。

单个表格行的示例可能是:

<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>

现在您可以相应地迭代项目,而与它们的 ID 无关。

现在您可以使用此处所述的请求验证: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();

我们将信息存储在键“列表”中(参见 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
);

【讨论】:

  • 谢谢,我想我快到了,但现在收到此错误消息:传递给 Illuminate\Database\Eloquent\Model::update() 的参数 1 必须是数组类型,给定对象,叫进来。我阅读了 Laravel 文档,但无法弄清楚我做错了什么。我将包含我放入控制器中的内容
  • 您不能简单地将验证传递给对象。它现在有另一个结构。你需要重新排列它。
  • 您也不能在控制器的 der 验证字符串中使用 ...。请看这里如何使用验证laravel.com/docs/master/validation (exp.Required|string)
  • 使用 $bodyContent = $request->getContent();访问您的表单数据。应该有一个关键的“列表”,您可以在其上进行迭代、创建计划对象、设置值并创建对象之间的关系
  • 对不起,我想我只是不明白这里的概念。我迷路了。我修改了验证字符串。现在我看到它进入了一个名为 $validator 的对象。但是,我不知道如何将该 $validator 对象放入一个数组中,然后我可以将它传递给我的数据库
【解决方案2】:

您需要创建一个选项组和选项表来处理您的所有列表。

例如,您需要一个位置列表和一个餐厅列表。

在 Option Group 中添加 Location List 的父级,在 Option 中添加子级,并在 Option.php 中加入它们,以便将来处理您的所有列表。

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

在我的示例中,group_id 是父列表的 ID,这样您就可以获得存储的所有位置选项。

在您的控制器中:

 $locationList = Option::getOfficeLocationList();

在你的刀片中:

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

就是这样:在您的验证中抛出 formData :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多