[英]JavaScript recursive function to transform parent/child records into a nested array
[英]Creating child records with parent model and return nested in response
我目前正在开发一个使用环回框架的项目。 令人非常沮丧的是,我觉得我正在与这个框架作斗争,以便完成一些非常简单的事情。 我只需要在收到请求时创建新创建的关联实例,以创建包含子项信息的父实例。 我已经让它工作到它实际上创建子项但我尝试设置属性所以我可以返回响应中的父项和子项...它实际上并没有设置子属性。 这里发生了什么??? ( 编辑我假设模型实例实现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 } }; }); };
让我试着用简单的语言解释一下。
假设您的父模型是Library
,您的子模型是Book
。 所以现在图书馆有很多图书和图书belongsTo
图书馆吧。
现在您可以创建如下所示的Library
和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
模型中的关系名称
希望这能解决你的问题。
我目前通过在所有模型实例上调用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 } }; }); };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.