我在Bookshelf.js方面苦苦挣扎,希望有人可以帮我忙。
我的客户有各种类型的联系人(电子邮件地址,facebook,skype等)。因此,我分为三个表以对类型进行规范化。我似乎无法找出如何正确查询和渴望加载联系人类型的方法。我可以通过以下方式轻松获得联系方式
new Customer({id: 1}).fetch({withRelated: ['contacts']}).then((customer) => {
console.log(customer.toJSON());
})
但是对于我的一生,我似乎无法弄清楚如何将这些联系人与各自的类型进行匹配。 Rails做了很多这样的事情,男孩,我很后悔...
桌子
customers = knex.schema.createTable('customers', function(t) {
t.increments('id').primary();
t.string('emailAddress').notNullable().unique();
t.timestamps(true, true);
});
contacts = knex.schema.createTable('contacts', function(t) {
t.increments('id').primary();
t.string('value').notNullable();
t.integer('contact_type_id').references('contact_types.id');
t.string('contactable_type').notNullable();
t.integer('contactable_id').notNullable();
});
contact_types = knex.schema.createTable('contact_types', function(t) {
t.increments('id').primary();
t.string('value').notNullable();
});
楷模
const Customer = bookshelf.Model.extend({
tableName: 'customers',
contacts: function() {
return this.morphMany('Contact', constants.CONTACTABLE);
}
});
const Contact = bookshelf.Model.extend({
tableName: 'contacts',
contactable: function() {
return this.morphTo(constants.CONTACTABLE, 'Customer');
},
type: function() {
return this.belongsTo('ContactType');
}
});
const ContactType = bookshelf.Model.extend({
tableName: 'contact_types',
contacts: function() {
return this.hasMany('Contact');
}
});
最佳答案
我相信在withRelated数组中链接关系应该可以解决问题。请尝试以下操作:
new Customer({id: 1}).fetch({withRelated: ['contacts.type']}).then((customer) => {
console.log(customer.toJSON());
})