Универсальные многоразовые формы данных. Рецепты приготовления и сервировки

в 8:06, , рубрики: php, данные, пересборка, метки:

Данные в любом приложении являются ключевым фактором простоты их понимания. Со временем вырабатывается определенный подход к их выборке, обработке и обновлению. Если обрабатывая данные вы все еще задумываетесь над тем в какой форме хранить ваши данные, как из списка выбрать то что нужно — возможно данный подход упростит вашу жизнь. Основные требования к хранению данных могли бы звучать как то так:

Структура максимально близкая к реляционной. Подобная форма хранения данных завоевала популярность у разработчиков и мы не будем от нее отказываться.

Данные должны обеспечивать простоту доступа к основному элементу по идентификатору. Взаимосвязи со смежными элементами строятся на основе использования вторичного ключа в качестве указателя на основной элемент. Быстрый доступ будет плюсом.

Повторное использование списка данных. Единожды получив срез данных должна оставаться возможность, обращение к любому из элементов по его основному ключу или совпадению со значением одного или нескольких атрибутов а также построение списков из выборки.

Дополнительным бонусом будет использование «налету» что позволит обращаться к объектам через несколько уровней.

Однозначная поддержка перехода по любым из возможных связей: один ко многим, много к одному и много ко многим. Возможность быстрой модификации логики связей при дальнейших изменениях структуры данных.

После многочисленных проб и ошибок нашел форму, которая меня устроила чуть меньше чем полностью. Условно давайте назовем ее «Основной формой». Наглядно данные основной формы можно представить массивом ключи которого будут значения автоинкрементного поля таблицы, а значения — список полей записи выбранной таблицы. Для выборки подобной структуры из базы данных будем использовать функцию условно названную rebuild (пересборка) rb():

pre(rb(«marks»));

Array(
    [1] => Array([id] => 1, [name] => Вольво)
    [2] => Array([id] => 2, [name] => Мерседес)
    [4] => Array([id] => 4, [name] => Ситроен)
)

Уникальные автоинкрементные поля гарантируют нам конфликты имен записей данных. Они же в дальнейшем помогут в формировании динамических фильтров, поэтому их использование в дальнейшем также обосновано.

Связанная таблица моделей могла бы выглядеть следующим образом:

pre(rb(«models»));

Array(
    [1] => Array([id] => 1, [marks_id] => 1, [name] => Volvo S60, [price] => 1644000)
    [2] => Array([id] => 2, [marks_id] => 1, [name] => Volvo V40, [price] => 1309000)
    [3] => Array([id] => 3, [marks_id] => 2, [name] => CLS Shooting Brake, [price] => 3520000)
)

Дальнейшая идея использования подобных конструкций сводится к последовательному казанию полей по которым мы выбираем и значений для выборки. Полем считается текстовое поле, ключи массива или числово считются значением для выборки. При этом выборка всех нужных нам значений может происходит без вынесения кода в контролер а может быть сделана прямо в шаблоне.

Отобразить список моделей в которых есть хотя бы одна марка и список этих марок.

<? foreach(rb("marks", "id", "id", rb("models", "marks_id")) as $marks): ?>
	<h1><?=$marks['name']?></h1>
	<? foreach(rb("models", "marks_id", "id", $marks['id']) as $models): ?>
		<div><?=$models['name']?></div>
	<? endforeach; ?>
<? endforeach; ?>

image

Подобный подход позволяет реализовать простую линейную логику практически без зависимостей и быстро модифицируемый. Набор ключей в параметрах функции пересборки легкость восприятия фукнционала и его модификации.

При этом все модели Вольво выбираются следующим образом, где идентификатор марки получаем из ГЕТ запроса страницы:

<? pre(rb(«models», «marks_id», «id», $_GET['marks_id'])) ?>

Array
(
    [1] => Array([id] => 1, [marks_id] => 1, [name] => Volvo S60, [price] => 1644000)
    [2] => Array([id] => 2, [marks_id] => 1, [name] => Volvo V40, [price] => 1309000)
)

Подобным образом можно выбирать и под другим полям. Выборка модели по ее id выглядит следующим образом:

<? pre(rb(«models», «id», $_GET['id'])) ?> где $_GET['id'] = 2;

Array
(
    [2] => Array([id] => 2, [marks_id] => 1, [name] => Volvo V40, [price] => 1309000)
)

Выбрать по одной подели каждой марки:

<? pre(rb(«models», «marks_id»)) ?>

Array
(
    [1] => Array([id] => 2, [marks_id] => 1, [name] => Volvo V40, [price] => 1309000)
    [2] => Array([id] => 3, [marks_id] => 2, [name] => CLS Shooting Brake, [price] => 3520000)
)

Подобным образом происходит обращение от модели к марке машины.

<? if($models = rb("models", "id", $_GET['id'])): ?>
    <? pre(rb("marks", "id", $models['marks_id'])); ?>
<? else: pre("Модель не найдена"); endif; ?>

Array(
    [1] => Array([id] => 1, [name] => Вольво)
)

Несмотря на некоторые недостатки, подобный подход позволяет на 90% закрыть запросы к данным используя стандартную первую форму.
Надеюсь данный подход кому нибудь помог сделать жизнь проще, а данные понятнее. Упрощает жизнь то, что вы получаете всегда форму аналогичную той, которую получили бы без параметров. Логика приложения становится значительно предсказуемой.

Ну и собственно реализация данной функции.

Автор: mpakep

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js