Всем привет, в одном проекте который изначально был без админки и для хранения данных использовал конфиг json на сервере который напрямую редактировался и тд, я решил это самое дело поправить и вынести в бд, использую orm redbeenphp (единственная с которой я когда то работал, как такого опыта со сложными sql запросами нет, максимум переименовать, создать или удалить по этому использую orm)
Вот пример самого json конфига:
{
"metaInfo": {
"title": "Торшеры напольные в современном стиле - купить с бесплатной доставкой в магазине #####!",
"description": "Торшеры напольные в современном стиле купить с оплатой при получении и бесплатной доставкой. Большой выбор моделей, все в наличии на складе. Звоните, заказывайте!",
"keywords": "Торшеры напольные в современном стиле"
},
"siteMetrics": {
"head": "\/metrics.html",
"footer": ""
},
"siteInfo": {
"description": "Крупнейший поставщик<br>освещения",
"phone": {
"pretty": "#####",
"link": "#####",
"text": "Звонок бесплатный"
},
"currencySymbol": " ₽"
},
"preview": {
"titleForm": "Оставить заявку на подбор",
"titlePreview": "Торшеры напольные в современном стиле",
"listPreview": [
{
"text": "<span>Бесплатная доставка<\/span> по всей России"
},
{
"text": "Оплата при <span>получении<\/span>"
},
{
"text": "Все товары <span>в наличии<\/span>"
}
],
"listImage": "\/icons\/tick-white-icon.svg",
"imageRight": "\/torsher-loft.png",
"backgroundImage": "\/bg-2.jpg",
"linksToOtherProducts": []
},
"why": [
{
"image": "\/icons\/china-icon.svg",
"text": "Работаем напрямую с производителями"
},
{
"image": "\/icons\/container-icon.svg",
"text": "Все товары в наличии на складе"
},
{
"image": "\/icons\/truck-icon.svg",
"text": "Совершенная логистика, отработанная годами"
},
{
"image": "\/icons\/2-icon.png",
"text": "Года гарантии на все товары"
}
],
"catalog": {
"title": "Каталог торшеров в современном стиле",
"productsFile": "file-16.json",
"filterSticky": true,
"loadingModeNewProducts": "by-scrolling"
},
"discount": {
"title": "Получите дополнительную скидку",
"subtitle": "Обеспечим лучшее предложение по цене",
"image": "\/icons\/lock-icon.svg"
},
"lider": {
"title": "#####! — Лидер в области светотехники",
"subtitle": "Мы работаем как с розничными клиентами, так и с крупными оптовиками, дизайнерами и девелоперами",
"blocks": [
{
"image": "\/icons\/container-icon.svg",
"title": "<span>3<\/span> склада",
"text": "На территории РФ"
},
{
"image": "\/icons\/warehouse-icon.svg",
"title": "Более <span>120<\/span>",
"text": "Брендов производителей"
},
{
"image": "\/icons\/assortment-icon.svg",
"title": "Более <span>110 000<\/span> товаров",
"text": "В наличии на складе более 50 000"
}
]
},
"footer": {
"copyright": "© %year% #####! Все права защищены."
},
"landOptions": {
"useCatalogSection": false,
"rootCategories": [],
"rootSubCategories": [],
"manualHTMLStructure": "",
"orderManualStructure": "none",
"bodyClass": ""
}
}
Изначально идея была просто создать одну таблицу со всеми ключами (metaInfo, siteMetrics) и просто кинуть json туда но решил что это не совсем правильно, дальше решил разбить таблицу по основным ключам configs (Системная информация которая нужна для админки которую я делаю) и связанные с ней подтаблицы configs_sitemetrics и тд и в итоге набросал пока что такой код
$path = 'http://example.com/content/sovremennye-torshery.json';
$data = json_decode(file_get_contents($path), true);
$tablePrefix = "configs";
$withNesting = fn(array $key) => join("_", $key);
$withPrefix = function (string $key) use ($tablePrefix) {
$key[0] = strtoupper($key[0]);
return "{$tablePrefix}" . strtolower($key);
};
/* Основа */
$userId = 4;
$user = R::load('users', $userId);
$config = R::dispense($tablePrefix);
$user["ownConfigList"][] = $config;
$config["name"] = "Sovremennye torshery";
$config["description"] = null;
$config["file"] = "sovremennye-torshery";
$config["added"] = "2022-11-07T00:46:15+03:00";
$config["modified"] = "2022-12-14T18:03:32+03:00";
$config["author"] = $user["login"];
/* Сохранение конфига */
R::store($user);
/* Модули */
$dataKey = "metaInfo";
$cSiteMetrics = R::dispense($withPrefix($dataKey));
$cSiteMetrics["configs"] = $config;
$cSiteMetrics["title"] = $data[$dataKey]["title"];
$cSiteMetrics["description"] = $data[$dataKey]["description"];
$cSiteMetrics["keywords"] = $data[$dataKey]["keywords"];
R::store($cSiteMetrics);
/* */
$dataKey = "siteMetrics";
$cMetaInfo = R::dispense($withPrefix($dataKey));
$cMetaInfo["configs"] = $config;
$cMetaInfo["head"] = $data[$dataKey]["head"];
$cMetaInfo["footer"] = $data[$dataKey]["footer"];
R::store($cMetaInfo);
/* */
$dataKey = "siteInfo";
$cSiteInfo = R::dispense($withPrefix($dataKey));
$cSiteInfo["configs"] = $config;
$cSiteInfo["description"] = $data[$dataKey]["description"];
$cSiteInfo["currencySymbol"] = $data[$dataKey]["currencySymbol"];
R::store($cSiteInfo);
/* */
$dataKey = ["siteInfo", "phone"];
$cSiteInfoPhone = R::dispense($withPrefix("siteInfoPhone"));
$cSiteInfoPhone["siteinfo"] = $cSiteInfo;
$cSiteInfoPhone["pretty"] = $data[$dataKey[0]][$dataKey[1]]["pretty"];
$cSiteInfoPhone["link"] = $data[$dataKey[0]][$dataKey[1]]["link"];
$cSiteInfoPhone["text"] = $data[$dataKey[0]][$dataKey[1]]["text"];
R::store($cSiteInfoPhone);
Не совсем понимаю правильно ли делаю или стоит например ту же таблицу phone перести выше и хранить в виде json