Сохранение значений динамического выбора в базе данных — Laravel

#php #laravel #vue.js #eloquent #vuejs2

#php #laravel #vue.js #красноречивый #vuejs2

Вопрос:

Я работаю с несколькими полями выбора в форме, которые отображаются динамически.

Здесь, в приведенном ниже сценарии, я сопоставляю выбор с родительским заголовком.

Пример результата { "1": [ 2 ], "2": [ 1, 3 ] }

         <table class="table">
          <thead>
            <tr>
              <td>Variation Name</td>
              <td>Variation Values</td>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Size</td>
              <td>
                <select multiple="multiple">
                  <option value="2">Medium</option>
                </select>
              </td>
            </tr>
            <tr>
              <td>Color</td>
              <td>
                <select multiple="multiple">
                  <option value="1">White</option>
                  <option value="3">Blue</option>
                  <option value="4">Black</option>
                </select>
              </td>
            </tr>
          </tbody>
        </table>  

Я передаю результат контроллеру Laravel, чтобы я мог сохранить ответ..

Я не уверен, как мне сохранить данные в базе данных..

 public function itemsStore(Request $request)
    {
        $items_arrays = array($request['itemsArray'], true);
        dd(items_arrays);
    }
  

dd Результатом является

 array:2 [
  0 => "{"1":[2],"2":[1,3]}"
  1 => true
]
  

Как мне сохранить значения в базе данных в соответствующем формате

 item_id | item_value_id
   1             2
   2             1
   2             3
  

Я заполняю вышеупомянутый объект с помощью Vue. Отправка данных контроллеру через библиотеку axios.
Скрипка

Комментарии:

1. Как вы отправляете форму, т. Е. Используете ли вы ajax или просто отправляете стандартную форму?

Ответ №1:

В PHP у вас есть разные способы определения array .

Один из способов — определить его, установив его значения явно, например:

 <?php
  $my_array_1 = array("first" => 0, "second" => 1) // or;
  $my_array_2 = array(0, 1, 2);
?>
  

Массивы могут хранить смешанные значения, так что это допустимо:

 <?php
  $my_array_3 = array(0, "one", 2)
?>
  

Ваш массив похож на предыдущий:

 <?php
  $items_arrays = array($request['itemsArray'], true);
?>
  

В PHP array() нет параметра только для добавленных элементов, поэтому true то, что вы помещаете в конец, является всего лишь вторым элементом вашего массива.
https://www.php.net/manual/en/function .array.php

Исходя из этого, ваш dd выводит именно то, что вы добавили при определении массива:

 array:2 [
  0 => "{"1":[2],"2":[1,3]}" // this is the string from $request['itemsArray']
  1 => true // this is the second element you added
]
  

Я думаю, ваша проблема в том, что вам нужно проанализировать то, string что вы получаете в своем $request['itemsArray'] .

  1. Итак, сначала:
 public function itemsStore(Request $request)
  {
    $json = json_decode($request['itemsArray']);
    // $json is now an associative array in PHP
    // something like: array(1 => array(2), 2 => array(1, 3))
    
    // $items_arrays = array($request['itemsArray'], true);
    // dd(items_arrays);
  }
  
  1. Затем вам нужно сгладить этот ассоциативный массив:
 public function itemsStore(Request $request)
  {
    $json = json_decode($request['itemsArray']);
    // $json is now an associative array in PHP
    // something like: array(1 => array(2), 2 => array(1, 3))
    $items_arrays = [];
    foreach(json as $key1 => $val1) {
      foreach($val1 as $key2 => $val2) {
        $items_array[] = array($key1 => $val2);
      }
    }
    // $items_arrays = array($request['itemsArray'], true);
    dd(items_arrays);
  }
  

( json_decode имеет необязательные параметры:https://www.php.net/manual/en/function.json-decode.php )

Конечно, вы должны проверить $request перед началом работы с ним — аутентификация и валидация важны!


Извините, если синтаксис неправильный — я не работал с PHP больше года и писал образцы наизусть (без проверки). Но идея, безусловно, правильная:

  1. Получить данные из запроса (проверить данные! Это не требуется для процесса, но требуется для производственной среды!)
  2. Преобразуйте его из строкового формата в массив PHP
  3. Прочитайте это в конечном массиве (так, как вам это нужно в конце)
  4. Поместите окончательный формат в базу данных

Ответ №2:

вам нужно дать какое-то имя для динамического выбора. Например, если у вас есть список [размер, цвет] атрибутов, вы могли бы сделать

На стороне сервера вы получите параметр массива attr[]

$attr = запрос()-> attr;

это должно выглядеть как $attr [‘size’] => [выбранный вами размер] $ attr [‘color’] => выбранный вами цвет.

Вы могли бы создать дамп для просмотра формы.

Я надеюсь, что это поможет, пожалуйста, дайте мне знать.

Комментарии:

1. Спасибо за ответ. Вот пример того, как я получаю данные. jsfiddle.net/eurodgj7 . Любое улучшение было бы высоко оценено

Ответ №3:

Попробуйте этот альтернативный

Убедитесь, что в вашем html вы установили атрибут name в массив, подобный приведенному ниже

 <select multiple="multiple" name="sizes[]" id="sizes">
  

Затем, чтобы сохранить его, вы можете получить его в контроллере, например

 $sizes = $request->input('sizes');//it will give you string separated by commas
$sizes = explode(',', $sizes);// to separate it explode the string

// save it to database
  

Аналогично для других входных данных, таких как ввод нескольких выбранных цветов, вы можете использовать вышеуказанные шаги

Комментарии:

1. Спасибо за быстрый ответ. Я использую Vue для заполнения объектов. Я сохраняю вышеупомянутый объект в itemsArray при передаче на контроллер laravel. Вот скрипка jsfiddle.net/eurodgj7