从 html 提交多个数组并将它们的属性组合成单独的集合并存储在 Laravel 应用程序中

submit multiple arrays from html and combine their attribute into seperate collections and store in Laravel App

我从 html 提交数组值并将它们接收到 Laravel 控制器,问题是我有多个数组,每个数组都有不同的属性数组。我想将信息作为集合存储到数据库中。让我举例说明

HTML 代码

<input type="text" name="tw_name[]" placeholder="name" value="{{ old('tw_name') }}">
<input type="text" name="tw_price[]"  placeholder="price" value="{{ old('tw_price') }}">

现在我正在控制器中接收 tw_name 和 tw_prices 数组,但我想使用如下模型将它们存储到数据库中

Bet::create([
  'name' => 'first_name',
  'price' => '10',
]);

Bet::create([
  'name' => 'second_name',
  'price' => '20',
]);

用户可以添加12个表单,所以我们不能说用户可以提交3个表单或5个表单或10个。所以我们需要处理同一个表单并将它们保存到数据库中。

如果用户提交 3 个表单,我们将在控制器中收到 3 个数组

Bet::create([
  'name' => 'first_name',
  'price' => '10',
]);

Bet::create([
  'name' => 'second_name',
  'price' => '20',
]);
Bet::create([
  'name' => 'thir_name',
  'price' => '30',
]);

如何将它们保存到数据库中,谢谢

单个 for()foreach() 循环可用于将这些保存到数据库:

for方法:

for($i = 0; $i < count($request->input('tw_name')); $i++) {
  Bet::create([
    'name' => $request->input('tw_name')[$i],
    'price' => $request->input('tw_price')[$i]
  ]);
}

foreach方法:

foreach($request->input('tw_name') as $index => $twName) {
  Bet::create([
    'name' => $twName,
    'price' => $request->input('tw_price')[$index]
  ]);
}

只要 tw_name[]tw_price[] 数组长度相同,此代码将为每对上传值创建一个 Bet 实例。

我建议您使用如下表单输入

<input type="text" name="request[0][name]" placeholder="name" value="">
<input type="text" name="request[0][price]"  placeholder="price" value="">

<input type="text" name="request[1][name]" placeholder="name" value="">
<input type="text" name="request[1][price]"  placeholder="price" value="">


<input type="text" name="request[2][name]" placeholder="name" value="">
<input type="text" name="request[2][price]"  placeholder="price" value="">

所以你的请求数据如下

array:2 [▼
  "_token" => "AXp1HzsVQzGJGCcnemS0PEdpi1aAMU3g6NK5zViB"
  "request" => array:3 [▼
    0 => array:2 [▼
      "name" => "s1"
      "price" => "10"
    ]
    1 => array:2 [▼
      "name" => "s2"
      "price" => "20"
    ]
    2 => array:2 [▼
      "name" => "s3"
      "price" => "30"
    ]
  ]
]

所以你可以像下面这样保存数据

Bet::insert($request->request);

foreach ($request->request as $value){
            Bet::create([
                'name' =>$value['name'],
                'price' =>$value['price']
            ]);
        }

试试这个:

<input type="text" name="tw_form[name][]" placeholder="name" value="{{ old('tw_name') }}">
<input type="text" name="tw_form[price][]"  placeholder="price" value="{{ old('tw_price') }}">

查看数组结构:tw_form[name][]

在控制器中:

原始数据:

array:1 [
  "tw_form" => array:2 [
    "name" => array:2 [
      0 => "a"
      1 => "b"
    ]
    "price" => array:2 [
      0 => "1"
      1 => "2"
    ]
  ]
]
        // for save formated data for save
        $create = [];

        // format raw data
        foreach ($request->input('tw_form') as $key => $item) {
            foreach ($item as $value_key => $value) {
                $create[$value_key][$key] =  $value;
            }
        }

结果是这样的:

array:2 [
  0 => array:2 [
    "name" => "a"
    "price" => "1"
  ]
  1 => array:2 [
    "name" => "b"
    "price" => "2"
  ]
]

现在只插入:

        foreach ($create as $item){
            Bet::create($item);
        }

如果您使用 javascript 动态构建 html,它可以更加简化,因为对于 html 中的每个数组,您已经分配了键 form[i][name] 并且form[i][price],这样您只需在控制器中迭代表单,并且您已经对变量进行了分组