Я отправляю значение массива из 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);
}
Если вы создаете html с помощью javascript динамически, это может быть упрощено еще больше, потому что просто для каждого массива в html вы уже назначаете ключ form[i][name]
и form[i][price]
, таким образом, вы просто повторяете форму в контроллере, и у вас уже есть сгруппированные переменные
Это упрощает работу, вам просто нужно добавить переменную счетчика в массив следующим образом: name = "tw_form[javascript_counter][name]" and name = "tw_form[javascript_counter][price]"
Я визуализирую его динамически из манипуляций с jquery.