考虑到下面的模型,我需要返回所有的TaskLists和它们的TaskListItems (1-N),并返回最后一个和它各自的Vehicle (N-1,车辆可以有一个或多个TaskListItems,但TaskListItem不能没有车辆存在)。
TaskList
let bookshelf = require('./base');
var TaskList,
TaskLists;
TaskList = bookshelf.Model.extend({
tableName: 'tasklists',
createdByUser: function () {
return this.belongsTo('User', 'createdBy');
},
resources: function() {
return this.belongsToMany('User', 'tasklist_resources', 'tasklistId', 'userId', 'id');
},
items: function() {
return this.hasMany('TaskListItem', 'tasklistId');
},
status: function () {
return this.belongsTo('StatusTaskList', 'statusId');
}
});
TaskLists = bookshelf.Collection.extend({
model: TaskList
});
module.exports = {
TaskList: bookshelf.model('TaskList', TaskList),
TaskLists: bookshelf.collection('TaskLists', TaskLists)
};TaskListItem
let bookshelf = require('./base');
var TaskListItem,
TaskListItems;
TaskListItem = bookshelf.Model.extend({
tableName: 'tasklist_items',
createdByUser: function () {
return this.belongsTo('User', 'createdBy');
},
vehicle: function() {
return this.belongsTo('Vehicle', 'vehicleId').through('VehicleAnomaly', 'vehicleAnomalyId', 'vehicleId', 'id');
}
});
TaskListItems = bookshelf.Collection.extend({
model: TaskListItem
});
module.exports = {
TaskListItem: bookshelf.model('TaskListItem', TaskListItem),
TaskListItems: bookshelf.collection('TaskListItems', TaskListItems)
};车辆
let bookshelf = require('./base');
var Vehicle,
Vehicles;
Vehicle = bookshelf.Model.extend({
tableName: 'vehicles'
});
Vehicles = bookshelf.Collection.extend({
model: Vehicle
});
module.exports = {
Vehicle: bookshelf.model('Vehicle', Vehicle),
Vehicles: bookshelf.collection('Vehicles', Vehicles)
};我可以用它的TaskListItems返回所有的TaskLists,但是我不知道如何在结果中添加第三层。
new TaskList()
.query(qb => {
qb.join('tasklist_items', 'tasklists.id', '=', 'tasklist_items.tasklistId');
qb.where('tasklist_items.statusId', '=', 1);
})
.fetchAll({
withRelated: [ {
'items': function(qb) {
qb.where('statusId', '=', 1);
}
}]
})如何返回TaskLists、它们的TaskListItems以及TaskListItem的每个Vehicle
发布于 2017-10-17 00:22:13
找到答案了。我在此分享,以防其他人需要这个:
new TaskList()
.query(qb => {
qb.join('tasklist_items', 'tasklists.id', '=', 'tasklist_items.tasklistId');
qb.where('tasklist_items.statusId', '=', 1);
})
.fetchAll({
withRelated: [ {
'items': function(qb) {
qb.where('statusId', '=', 1);
},
'items.vehicle': function(qb) {
qb.orderBy('location', 'ASC');
}
}]
})解决方案是在withRelated数组中添加一个新项,指向另一个子模型的子模型(vehicle)。
https://stackoverflow.com/questions/46769837
复制相似问题