使用父模型创建子记录并在响应中返回嵌套

时间:2017-06-08 02:14:38

标签: javascript node.js loopback

我目前正在开发一个使用loopback框架的项目。令人非常沮丧的是,我觉得我正在与这个框架作斗争,以便完成一些非常简单的事情。我只需要在收到请求时创建新创建的关联实例,以创建包含子项信息的父实例。我已经让它工作到实际创建子项的地步但当我尝试设置属性所以我可以返回响应中的父项和子项...它实际上没有设置子属性。这里发生了什么??? (编辑我假设模型实例实现了setter / getters以防止覆盖它设置的某些属性)

我无法在文档中找到关于做这样简单的事情的任何内容。我能找到的最多是检索嵌套模型。当我有一个有很多孩子的父母时,我似乎找不到创建它们的任何内容而不发送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
      }
    };
  });
};




2 个答案:

答案 0 :(得分:0)

让我试着用简单的语言解释一下。

假设您的父模型为Library且您的子模型为Book。所以现在图书馆有很多图书和图书belongsTo图书馆。

现在,您可以像以下

一样创建LibraryBooks
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其中booksLibrary模型中的关系名称

希望这能解决你的问题。

答案 1 :(得分:0)

我目前通过在所有模型实例上调用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
      }
    };
  });
};