如何通过多个连接表连接对象
How to join objects through via multiple join tables
我有三个模型:Event
、Gallery
和 Image
。 Image
是基本模型,代表单个媒体。 Gallery
是用户提交的 Images
的集合。用户仅在 Gallery
级别与 Images
交互,因为他们当时以单数 Galleries
的形式创建、修改和删除 Images
组。 Event
是 Galleries
的集合,它将内容与特定的现实世界事件相关联。
所以,我的关系如下:Event -> Event_Galleries -> Gallery -> Gallery_Images -> Image
我的问题是,通过 Bookshelf,有没有办法使用现有的连接表指定从 Event
到 Image
的关系?它的功能如下:
Event
-> Event_Galleries where Event_Galleries.event_id = Event.id
-> Gallery_Image where Event_Galleries.gallery_id = Gallery_Image.gallery_id
-> Image where Image.id = Gallery_Image.image_id
是的,您可以按照以下方式在 Bookshelf.js 模型中指定关系:
const Company = db.bookshelf.Model.extend({
tableName: 'companys',
hunters: function employees() {
return this.hasMany(Employee, 'company_id');
}
});
const Employee = db.bookshelf.Model.extend({
tableName: 'employees',
company: function company() {
return this.belongsTo(Company);
},
addresses: function addresses() {
return this.hasMany(EmployeeAddress);
},
});
const EmployeeAddress = db.bookshelf.Model.extend({
tableName: 'employees_addresses',
employee: function employee() {
return this.belongsTo(Employee);
}
});
Company.where({ id: 42 }).fetch([ withRelated: 'employees', 'employees.addresses' ])
.then(result => {
console.log(result);
}, error => {
console.log(error);
})
我有三个模型:Event
、Gallery
和 Image
。 Image
是基本模型,代表单个媒体。 Gallery
是用户提交的 Images
的集合。用户仅在 Gallery
级别与 Images
交互,因为他们当时以单数 Galleries
的形式创建、修改和删除 Images
组。 Event
是 Galleries
的集合,它将内容与特定的现实世界事件相关联。
所以,我的关系如下:Event -> Event_Galleries -> Gallery -> Gallery_Images -> Image
我的问题是,通过 Bookshelf,有没有办法使用现有的连接表指定从 Event
到 Image
的关系?它的功能如下:
Event
-> Event_Galleries where Event_Galleries.event_id = Event.id
-> Gallery_Image where Event_Galleries.gallery_id = Gallery_Image.gallery_id
-> Image where Image.id = Gallery_Image.image_id
是的,您可以按照以下方式在 Bookshelf.js 模型中指定关系:
const Company = db.bookshelf.Model.extend({
tableName: 'companys',
hunters: function employees() {
return this.hasMany(Employee, 'company_id');
}
});
const Employee = db.bookshelf.Model.extend({
tableName: 'employees',
company: function company() {
return this.belongsTo(Company);
},
addresses: function addresses() {
return this.hasMany(EmployeeAddress);
},
});
const EmployeeAddress = db.bookshelf.Model.extend({
tableName: 'employees_addresses',
employee: function employee() {
return this.belongsTo(Employee);
}
});
Company.where({ id: 42 }).fetch([ withRelated: 'employees', 'employees.addresses' ])
.then(result => {
console.log(result);
}, error => {
console.log(error);
})