Bookshelf.js渴望加载第三张表

时间:2016-07-21 02:19:03

标签: javascript database postgresql bookshelf.js knex.js

我正在与Bookshelf.js斗争,我希望有人可以伸出援助之手。

我是拥有各种联系人(电子邮件地址,Facebook,Skype等)的客户。所以我分成三个表来规范化类型。我似乎无法找到如何正确查询和急切加载联系人的类型。我可以通过

轻松获得联系人
new Customer({id: 1}).fetch({withRelated: ['contacts']}).then((customer) => {
    console.log(customer.toJSON());
    })

但是对于我的生活,我似乎无法弄清楚如何将这些联系人与他们各自的类型相匹配。 Rails做了很多这样的事情,BOY我很后悔......

表格

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');
  }
});

1 个答案:

答案 0 :(得分:1)

我相信在withRelated数组中链接关系应该可以解决问题。请尝试以下方法:

new Customer({id: 1}).fetch({withRelated: ['contacts.type']}).then((customer) => {
    console.log(customer.toJSON());
})