#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']
.
- Итак, сначала:
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);
}
- Затем вам нужно сгладить этот ассоциативный массив:
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 больше года и писал образцы наизусть (без проверки). Но идея, безусловно, правильная:
- Получить данные из запроса (проверить данные! Это не требуется для процесса, но требуется для производственной среды!)
- Преобразуйте его из строкового формата в массив PHP
- Прочитайте это в конечном массиве (так, как вам это нужно в конце)
- Поместите окончательный формат в базу данных
Ответ №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