Создание дочерних записей с родительской моделью и возврат вложенных в ответ

1

В настоящее время я работаю над проектом, который использует структуру loopback. Мне очень жаль, что я борюсь с этим фреймворком, чтобы получить что-то чрезвычайно простое. Мне просто нужно создать вновь созданные связанные экземпляры при получении запроса для создания родительского экземпляра с информацией для детей. Я получил его работу до такой степени, что она действительно создает детей, но когда я пытаюсь установить свойство, чтобы я мог вернуть родительский и дочерний элементы в ответ... он фактически не устанавливает свойство children. Что здесь происходит??? (edit Я предполагаю, что экземпляры модели реализуют сеттеры/геттеры для предотвращения переопределения некоторых свойств, которые он устанавливает)

Я не могу найти ничего в документации о том, чтобы делать что-то простое. Самое большее, что я могу найти, это поиск вложенных моделей. Кажется, я ничего не могу найти при их создании, не отправляя 20 запросов, когда у меня есть родитель со многими детьми.

module.exports = function(Parent) {
  Parent.on('dataSourceAttached', () => {
    const create = Parent.create.bind(Parent);
    Parent.create = async (data, opts) => {
      const { Child } = Parent.app.models;
      let instance;
      try {
        instance = await create(data);
        if (data && data.children && Array.isArray(data.children)) {
          const { id: parentId } = instance;
          const children = await new Promise((resolve, reject) =>
            Child.create(
              data.children.map(m => Object.assign({}, m, { parentId })),
              opts,
              (err, res) => (err ? reject(err) : resolve(res))
            )
          );
          instance.children = children;
          console.log(instance.children === children); // false (wtf... #@#$#$%)
        }
        return instance;
      } catch (err) {
        // handle err
      }
    };
  });
};
Теги:
loopback

2 ответа

0

В настоящее время я решил это, позвонив в toJSON во всех экземплярах модели, а затем изменив их по toJSON желанию, прежде чем возвращать форму, которую я хотел. Я ожидаю, что для этого потребуется какой-то способ, используя loopback без такого типа вещей... но мне все еще предстоит это выяснить. Любые дальнейшие ответы по-прежнему очень приветствуются.

module.exports = function(Parent) {
  Parent.on('dataSourceAttached', () => {
    const create = Parent.create.bind(Parent);
    Parent.create = async (data, opts) => {
      const { Child } = Parent.app.models;
      try {
        let children;
        const instance = await create(data);
        if (data && data.children && Array.isArray(data.children)) {
          const { id: parentId } = instance;
          children = await new Promise((resolve, reject) =>
            Child.create(
              data.children.map(m => Object.assign({}, m, { parentId })),
              opts,
              (err, res) => (err ? reject(err) : resolve(res))
            )
          );
        }
        const resp = Object.assign(instance.toJSON(), {children: children.map(child => child.toJSON());
        return resp;
      } catch (err) {
        // handle err
      }
    };
  });
};
0

Позвольте мне попытаться объяснить это простыми словами.

Предположим, что родительская модель - это Library а ваша дочерняя модель - Book. Итак, теперь Library hasMany Books and Book принадлежит belongsTo Library.

Теперь вы можете создавать Library и Books как Books ниже.

Library.create({
  name: "Library"
}, function(err, library) {
  // here library is created
  // Now if you have set relation, one can create books inside library like below
  library.books.create(book_array_data, function(err, books) {
    // here books are created
  })
})

Здесь я упомянул Library.books где books - это имя отношения в модели Library

Надеюсь, это решает вашу проблему.

  • 1
    Моя проблема не связана ни с отношениями, ни с созданием реальных дочерних экземпляров. Это я могу выполнить просто отлично. Родитель: instance = await create(data); Children: const children = await new Promise((resolve, reject) => То, что я хотел бы сделать, это вернуть обоих родителей с созданными .toJSON вложенными в ответ. Я фактически решил это, не возвращая экземпляр модели (используя .toJSON на родителей и детей). Я уверен, что это не идеально, и я бы предположил, что должен быть какой-то способ сделать это с помощью loopback, но это
  • 0
    да, я думаю, что это единственный способ. Но если вы готовы сделать еще один звонок, возможно, вы получите желаемый результат.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню