В настоящее время я работаю над проектом, который использует структуру 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
}
};
});
};
В настоящее время я решил это, позвонив в 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
}
};
});
};
Позвольте мне попытаться объяснить это простыми словами.
Предположим, что родительская модель - это 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
Надеюсь, это решает вашу проблему.
instance = await create(data);
Children:const children = await new Promise((resolve, reject) =>
То, что я хотел бы сделать, это вернуть обоих родителей с созданными.toJSON
вложенными в ответ. Я фактически решил это, не возвращая экземпляр модели (используя.toJSON
на родителей и детей). Я уверен, что это не идеально, и я бы предположил, что должен быть какой-то способ сделать это с помощью loopback, но это