TL; DR: я хочу использовать данные из одномерного массива произвольного размера, созданного userinput, и заполнить его значения в соответствующих полях двумерного массива произвольного размера, созданного с помощью запроса из базы данных .
У меня есть веб-приложение, в котором пользователь может получить доступ к данным БД как в режиме чтения, так и в режиме записи. Доступные ему записи в БД определяются отделами, к которым он принадлежит. Записи организованы в структуру БД, в которой таблица ядра содержит данные, видимые для ВСЕХ подразделений, а таблицы расширений, ссылающиеся на базу данных через FK, содержат данные, которые видны только пользователям, принадлежащим к отделу, связанному с этой таблицей расширения.
Я использую Lumen / Laravel и его красноречивую модель для взаимодействия с БД из моего Backend, пример кода для доступа к БД выглядит так:
$join = coretable::with($permittedTables)->find(1);
Здесь, $permittedTables
- это массив имен таблиц, ссылающихся на таблицы расширений, доступные пользователю.
Затем приведенный выше код извлекает следующий результат:
{
"id": 1,
"Internal_key": "TESTKEY_1",
"extensiontable_itc": {
"description": "EXTENSION_iTC_1"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_1"
}
}
Теперь у пользователя будет список, подобный списку. посмотреть во внешнем интерфейсе, где все эти данные были объединены в большую таблицу. В этом списке пользователь может щелкнуть поле и изменить его значение, а затем отправить http-запрос, чтобы сохранить эти изменения в БД. Этот http-запрос будет массивом в формате JSON, который будет json_decode()
в моем бэкэнде, и использовать переданный id
для извлечения модели, как показано выше.
Теперь, на этом этапе два набора данных, организованных в структуре ассоциативных массивов, будут сталкиваться друг с другом. Вводом http-запроса, скорее всего, будет одномерный массив, в то время как модель из БД почти наверняка будет многомерным массивом, который вы видели выше. Кроме того, существует огромное количество возможных комбинаций наборов данных. Это может быть комбинация, показанная выше, но это также может быть комбинация данных из других таблиц, не перечисленных здесь, и это может быть как больший, так и меньший набор таблиц, агрегированных в модель и вход пользователя. Следовательно, процесс, устанавливающий входной вход в БД, должен иметь возможность динамически определять, какое поле ввода должно быть помещено в какое поле БД.
Я делаю это впервые, и у меня не так много идей, как это сделать. Единственное, что мне пришло в голову, - это зеркальное отражение имен столбцов БД с индексами массива ввода, а затем l oop через модель и сравнение ее индексов с индексом выбранного в данный момент элемента ввода. Если они совпадают, значение из соответствующего поля ввода будет установлено в соответствующее поле БД. Мне известно, что для того, чтобы это работало, каждый столбец таблиц, затронутых этим процессом, ДОЛЖЕН иметь уникальное имя в БД. Это выполнимо, хотя. Тем не менее, в настоящее время это единственная идея, которую я мог придумать
Однако я хотел бы задать вам две вещи по этому поводу: 1) Существуют ли другие, менее "хакерские" подходы для решения проблемы, описанной выше? 2) Может ли кто-нибудь дать мне пользовательскую функцию / набор пользовательских функций, способных выполнять итерацию по двум массивам, из которых по крайней мере один будет многомерным, при сравнении их индексов, а затем установить значение от Array A
до Array B
, когда индексы совпадают?
Ниже приведен небольшой пример кода, в котором я создаю два массива, которые воспроизводят описанную ситуацию, с которыми вы можете поиграться:
Сначала входная сторона:
$inputArray = array(
"id" => 1,
"internal_key" => "TESTKEY_1",
"CPU" => "intelTest1",
"GPU" => "nvidiaTest1",
"Soundcard" => "AsusTest1"
"MAC" => "macTest1",
"IP" => "ipTest1",
"VLAN" => "vlanTest1"
);
Затем на стороне DB:
$modelArray = array(
"id" => 1,
"internal_key" => "TESTKEY_2",
"extensiontable_itc" => array (
"CPU" => "intelTest1",
"GPU" => "nvidiaTest2",
"Soundcard" => "AsusTest1"
),
"extensiontable_sysops" => array (
"MAC" => "macTest2",
"IP" => "ipTest1",
"VLAN" => "vlanTest1"
)
);