从 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]
,这样您只需在控制器中迭代表单,并且您已经对变量进行了分组
我从 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]
,这样您只需在控制器中迭代表单,并且您已经对变量进行了分组