首页 > 解决方案 > 通过 Laravel 中的表单传递数组

问题描述

我正在尝试通过表单将多个数组传递给 Laravel 控制器并将表单值附加到关系中。

我试图遍历请求数组,但我得到一个“未定义的索引”错误,我知道我没有以某种方式获取数据。提前致谢。

form.php

<form method="POST" action="{{ route('/trs') }}">
  @csrf
<input type="hidden" name="name[]" value="{{ $item->name }}" />
<input type="hidden" name="product_id[]" value="{{ $item->product_id }}" />
<input type="hidden" name="price[]" value="{{ $item->price }}" />
<input type="hidden" name="quantity[]" value="{{ $item->quantity }}" />
<button type="submit" class="btn btn-primary">
 Buy
</button>
 </form

Controller

  public function purchase(Request $request)
  {
         $data = $request->except('_token');
         $user= User::find(Auth::user()->id);
             foreach ($data as $item) {
              $ids = $item['product_id'];
              $names = $item['name'];
              $prices = $item['price'];
              $quantities = $item['quantity'];
              $orders->products()->attach([$ids => ['quantity' => $quantities, 'price' => $prices]]);
           }
  }

标签: laravel

解决方案


foreach正在迭代输入,而不是这些输入中的数组:

foreach ($data as $item)

在第一次迭代$item中是name数组。在第二次迭代$item中,product_id数组等name没有名为 的索引nameprice或者quantity,它的索引是数字的(0 索引)。

一种方法是迭代那些特别是数组的输入:

for ($i = 0; $i < count($data['names']); $i++) {
    $name = $data['name'][$i];
    $product_id = $data['product_id'][$i];
    $price = $data['price'][$i];

    ...
}

这里有一些假设,但希望这能说明如果您想继续使用以当前方式命名的输入,您需要做什么。

更新:

如果您想更改输入的名称,您可能会更轻松地将它们分组:

<input type="hidden" name="items[{{ $item->id }}][name]" value="{{ $item->name }}" />
<input type="hidden" name="items[{{ $item->id }}][price]" value="{{ $item->price }}" />
...

foreach ($request->input('items', []) as $id => $item) {
    $name = $item['name'];
    $price = $item['price'];
    ...
}

现在,与单个项目相关的输入通过项目的 id 组合到一个数组中。

当您动态添加字段时,您必须确保您也在使用这种类似的命名,其中包括一个用于分组它们的键,在本例中为“id”。

items[27][name]
items[27][price]
...

推荐阅读