Я хотел бы использовать EntityManager для таблицы у которой есть связь с другими таблицами, а для того чтобы его использовать нужно создать DataSource. Мне не нравится стандартный подход TypeORM, который описан в документации для того чтобы сохранить запись, у которой есть связи с другими таблицами: 1) Необходимо сначала сходить в базу и получить объекты, которые связаны с новой записью в бд (сколько связей столько раз нужно и в базу ходить, прежде чем сделать сохранение) При этом надо тянуть ещё дополнительные Repositories в order.service.ts, чтобы получить эти объекты и это всё нарушается принцип SRP 2) Необходимо связать эти объекты между собой 3) И уже потом сохранить По этому я бы хотел использовать EntityManager, чтобы я смог при помощи SQL или QueryBuilder создать новую сущность при этом чтобы у неё были связи с существующими записями из других таблиц и не нарушать принципы проектирования (или хотя бы уменьшить количество зависимостей)
Как-то все сложно звучит. В нест хорошо прописана чистая архитектура. Поэтому например работа с репазиторием конкретной сущности хорошо ложится в этот контекст. Сам репазиторий, это более высокая надстройка над датасоурс, он внутри себя автоматом подтянет все зависимости перечисленных энтити в коде указанном выше. Ну или если заморачиваться, тогда стоит посмотреть в сторону провайдеров неста и описать нужный синглтон в useFactory. Если я правильно понял запрос
Мне кажется, что да, так как мне нужно использовать один объект в разных местах, попробую и этот вариант. Спасибо
Ты всё усложнил, мне кажется. Добавляешь в Entity столбец ID родительской сущности. Допустим у тебя users и posts. В posts добавляешь не только связь к родителю, но и объявляешь его столбцом: userId: тип; После этого ты можешь спокойно создавать посты await em.save(Posts.create({ userId: 123, message: 'fff' }));
Мне так тоже кажется, я не смог найти способ который бы позволял сохранять сущность со связями, при этом не ходить в БД за тем чтобы получить объекты с которыми будет связь и только когда свяжутся объекты можно будет это всё сохранить. Сейчас попробую этот способ, так как он проще, чем решение которое я пытаюсь изобрести. Спасибо большое
Хочу тут спросить, em в коде это entityManager?
о, интересный способ. А как typeorm будет понимать что этот userId относится к связи с таблицей users, а не просто отдельная колонка?
Никак. У них общее название. Этого достаточно. Остальное сделает СУБД (не даст записать туда несуществующий user ID)
о, понял. Круто, спасибо
А если пользователь уже существует, подойдёт ли способ?
Если что в связях через атрибуты декоратора можно установить название колонок.
Он наоборот. Должен уже существовать.
да да, это знаю. Просто думал что typeorm просто выкинет ошибку, потому что колонка дублируется
Понял, ещё раз спасибо
Я добрался до совета, попутно разбираясь в других проблемах, у меня возник вопрос: А откуда у Posts появляется метод сreate?
Он extends от BaseEntity
Пока не понимаю. У меня есть OrderService и для него создаю метод createOrder, Order связан с User как много-ко-одному (у 1 пользователя много заказов). На скриншоте Order это класс, который используется для модели Что мне нужно дописать в мой код, чтобы заработал код из комментария?
Как ты определил Entity?
Обсуждают сегодня