Обновление Lumen / Laravel - Как различить столбцы с одинаковыми именами? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть следующий вариант использования:

В моем веб-приложении пользователь видит список элементов из нашей БД. Это представление регулируется отделами, к которым принадлежит пользователь, например, iT C и Sysops. Если пользователь не принадлежит к группе, связанной с таблицей, данные этой таблицы не будут загружены в список.

Чтобы отразить эти требования в морфологии БД, у нас есть база данных, которая содержит данные, видимые для ВСЕХ подразделений, и таблицы расширений, связанные с этой таблицей через FK. Взаимосвязь между coretable и extensiontables является взаимно-однозначной, FK всегда хранится в расширенных таблицах.

Теперь данные для пользователя собираются следующим образом:

$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-запрос будет содержать ВСЕ поля соответствующей строки в списке в формате JSON. Эти поля, конечно, представляют соответствующие атрибуты из таблиц БД. После декодирования в backend-API с помощью json_decode() я собираюсь использовать идентификатор, чтобы идентифицировать уязвимую запись в coretable и извлечь модель, как вы видели выше в моем OP.

Теперь есть 2 очень большие вопросы, с которыми я сталкиваюсь:

1) Как я могу просто «массово обновить» полную запись с данными, поступающими из внешнего интерфейса? Вот так (псевдокод):

Model::with($tables)->find($id)->update($updateData);

Это заставит БД обновлять ВСЕ поля соответствующей записи, даже те, в которые не было внесено никаких изменений, но также позволяет мне написать скрипт, который может принимать в любом обновлении любого поля, доступного пользователю.

2) Вид, связанный с первым: структура модели, полученная с помощью

$join = coretable::with($permittedTables)->find($id); 

, в основном представляет собой 2 -мерный массив, который будет соответствовать либо другому 2-мерному массиву, поступающему из внешнего интерфейса, если я попытаюсь сделать http-запросы JSON -payload mimi c структурой модели или 1-мерным массивом. Как можно объединить эти два, входящий запрос на обновление и модель из БД, чтобы каждое поле из запроса на обновление было применено к правильному полю в БД? Особенно, если есть столбцы из различных расширенных таблиц с одинаковыми именами. Здесь я должен сказать, что я все еще могу изменить имена столбцов. Поэтому я могу применить к ним «флаг», помечая их как столбец таблицы X, например, «description_it c». Я этого еще не сделал, потому что боялся, что использование такого метода для различения столбцов из разных таблиц считается плохой практикой ^^

...