Bookshelf.js Eager Загрузка третьей таблицы

Я борюсь с 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');
  }
});

1 ответ

Я считаю, что цепочка отношений в массиве withRelated должна помочь. Попробуйте следующее:

new Customer({id: 1}).fetch({withRelated: ['contacts.type']}).then((customer) => {
    console.log(customer.toJSON());
})
Другие вопросы по тегам