Иван
у меня стек на односвязном списке, а у них на битриксе!
Михаил
Михаил
К слову в пыхе стек реализован на основе двусвязного списка. Но мы нашего слоника не осуждаем
Иван
Михаил
Kirill
Andrew
Приветствую! Каким способом нынче пользуются, чтобы сохранить массив объектов определенного класса как поле сущности? JSON?
Andrew
Kirill
Kirill
или нужен массив?
Kirill
для массива можно использовать массивы просто)
Kirill
CREATE TABLE xxxx (
// ...
skins SkinType[] NOT NULL DEFAULT [],
);
типа такого
Andrew
Хотелось бы избежать хранения SkinHistoryItem как отдельных сущностей бд. В целом, ChatGPT подсказывает серелизовать их и хранить просто как JSON, как я и подозревал. Но я думал, есть более удобный способ...
Kirill
ну в теории можно создать тип #[ORM\Column(type: 'SkinType[]')]
Kirill
но там могут быть проблемы с UoW
Kirill
надо смотреть как persist на такое реагирует и меняет ли данные в массиве после сохранения
Павел
Но лучше сделать коллекцию тогда
Kirill
Kirill
но сходу не вспомню
Andrew
А вот такое решение - это зашквар?
Kirill
Kirill
а, ну и у тебя типы не правильные
Павел
ну у меня были где-то траблы с этим
Ну если прям как ты написал, то возможно, такого использования не припоминаю. А кастомный тип - уже как угодно верти в рамках одного поля
Kirill
он вернёт не SkinHistoryItem, а array<array-key, object> скорее всего)
Павел
Десериализовать можно или ручками собрать
Kirill
Павел
вместо json_encode
Павел
Kirill
типа если сделать:
$skins[42]->color = 'IDDQD';
то не факт что доктрина увидит чендж этого поля в объекте
Павел
Создать свой тип под SkinHistoryСollection и хранить его как json
Павел
Но это геморно)
Павел
Не сильно, но в целом кодика пописать придется
Kirill
Andrew
как развёрнуто, спасибо 😄
посмотрю как свои типы писать, попробую, если мой метод коленный не прокатит
Kirill
Kirill
только у тебя десериализатор неправильно работает, тип там некорректный
Kirill
можешь вместо json прописать тупо text и сохранять через serialize/deserialize)
Kirill
но это чревато, любое изменение кода и гг вп
Павел
Ну и не забывать сетить обратно, хотя как будто имутабельно)))
Павел
Вообще тупо через конструктор собирать и всё)
Михаил
Оо, в постгрес можно свои типы создавать
Михаил
прикольнинько
Kirill
лол)
Kirill
просто есть подозрение, что только в mysql их нельзя создавать
Михаил
Да не, просто бд это деталь и привычка всё организовывать в коде
Михаил
это же как с наркотиками
Kirill
ну как бы таблица и есть тип просто
Михаил
кто то может держатся, а кто-то срывается и пишет бизнес логику на триггерах
Kirill
и в постгре, если не путаю, для каждой таблицы создаётся свой тип в фоне
Kirill
следовательно, можно просто брать и вкладывать одну таблицу в другую (но это не точно)
Kirill
ну и массивы тоже есть
Михаил
Курто, пойду накажу доктрину, чтоб ей сладко не было
Kirill
следовательно, чтобы создать массив каких-то типов - достаточно создать массив этих типов и в бд)
Kirill
ну и опять же енамы те же самые
Kirill
create type some as enum(....);
Kirill
тоже создание типа
Михаил
Вообще кстати у меня есть проблема
У меня есть лендген, в нём всё разбито на компоненты.
Сам лендинг - компонент, он состоит из других компонентов, они тоже из компонентов ....
Короче дерево
Вот я и думал. а есть какой-нибудь порнаграфических способ вот так хранить компоненты
Чтоб я одним запросом мог выдернуть ВСЕХ детей и внуков какого нибудь компонента
Kirill
ну так хранить их древовидно)
Михаил
А забирать циклом, да?
Kirill
но не факт что self reference сработает при создании типа, не проверял
Kirill
Kirill
получится монга)
Михаил
да, вот тоже подумал что документоориентированная бд подошла бы лучше
Kirill
CREATE TYPE component (
name ...,
...,
children component[] NOT NULL DEFAULT [],
...
);
Kirill
типа такого
Kirill
ну и
CREATE TABLE components (
id ...,
children component[] NOT NULL DEFAULT [],
);
Kirill
но постгря не умеет в синтаксис поиска по массиву
Kirill
тьфу ты
Kirill
доктрина)
Kirill
там синтаксис у постгри обратный
Kirill
обычно делают hasystack = :needle, а в поиске по массиву постгри наоборот: :needle = ANY("haystack")
Kirill
т.е. вначале значение, а потом поле где искать
Kirill
и DQL парсер на таком ёбу даёт)
Kirill
так что надо извращаться
Михаил
Да уж проще на чистом, а потом замапить
Kirill
ну я не пробовал в функцию превратить
Kirill
типа IN_ARRAY("field", :value)
Kirill
но подозреваю что доктрина такое тоже не схавает, ей надо чтоб было <field> = <value> в where условиях везде (но это не точно)