Отправить несколько массивов из html и объединить их атрибуты в отдельные коллекции и сохранить в приложении Laravel

Я отправляю значение массива из 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',
]);

Как я могу сохранить их в базу данных, спасибо

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
25
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Для сохранения их в базе данных можно использовать один цикл 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], таким образом, вы просто повторяете форму в контроллере, и у вас уже есть сгруппированные переменные

Я визуализирую его динамически из манипуляций с jquery.

HadiNiazi 22.03.2022 15:39

Это упрощает работу, вам просто нужно добавить переменную счетчика в массив следующим образом: name = "tw_form[javascript_counter][name]" and name = "tw_form[javascript_counter][price]"

WILLIAM DAZA 22.03.2022 15:41

Другие вопросы по теме