自引用与Objection.js的多对多关系

我有CurrencyExchangeRate数据库表如下所示:

 CREATE TABLE Currency (id INT, code VARCHAR(3), name TEXT); CREATE TABLE ExchangeRate (baseCurrencyId INT, counterCurrencyId INT, rate FLOAT); INSERT INTO Currency (id, code, name) VALUES (1, 'USD', 'US Dollars'), (2, 'AUD', 'Australian Dollars'); INSERT INTO ExchangeRate (baseCurrencyId, counterCurrencyId, rate) VALUES (1, 2, 1.342), (2, 1, 0.745); 

给定一个baseCurrency id和一个counterCurrency的code ,我想find相应的汇率 counterCurrency的name

build立这种关系最有效的方法是什么? (我使用的是Objection.js v0.4.0)

我为表格和列名添加了引号,以便区分大小写:

 CREATE TABLE "Currency" ( id INT, code VARCHAR(3), name TEXT ); CREATE TABLE "ExchangeRate" ( "baseCurrencyId" INT, "counterCurrencyId" INT, rate FLOAT ); INSERT INTO "Currency" (id, code, name) VALUES (1, 'USD', 'US Dollars'), (2, 'AUD', 'Australian Dollars'); INSERT INTO "ExchangeRate" ("baseCurrencyId", "counterCurrencyId", rate) VALUES (1, 2, 1.342), (2, 1, 0.745); 

你可以build模连接表中存储额外参数的多个关系:

 const knex = require('knex')({ client: 'pg', connection: 'postgres:///objection_test' }); const { Model } = require('objection'); const Promise = require('bluebird'); class Currency extends Model { static get tableName() { return 'Currency'; } static get relationMappings() { return { currencyWithRate: { relation: Model.ManyToManyRelation, modelClass: Currency, join: { from: 'Currency.id', through: { from: 'ExchangeRate.baseCurrencyId', to: 'ExchangeRate.counterCurrencyId', extra: ['rate'] }, to: 'Currency.id' } } }; } } const boundModel = Currency.bindKnex(knex); boundModel.query().then(currencies => { // get related currencies for each return Promise.all(currencies.map(cur => { return Promise.join(cur, cur.$relatedQuery('currencyWithRate'), (cur, exchangeRateCurrency) => { return { currency: cur, exchangeRateCurrency: exchangeRateCurrency }; }); })); }).then(result => { console.dir(result, { depth: null}); }).finally(() => { return knex.destroy(); }); 

让我们假设上面的代码是test.js:

 Mikaels-MacBook-Pro-2: mikaelle$ node test.js [ { currency: AnonymousModelSubclass { id: 1, code: 'USD', name: 'US Dollars', currencyWithRate: [ AnonymousModelSubclass { id: 2, code: 'AUD', name: 'Australian Dollars', rate: 1.342 } ] }, exchangeRateCurrency: [ AnonymousModelSubclass { id: 2, code: 'AUD', name: 'Australian Dollars', rate: 1.342 } ] }, { currency: AnonymousModelSubclass { id: 2, code: 'AUD', name: 'Australian Dollars', currencyWithRate: [ AnonymousModelSubclass { id: 1, code: 'USD', name: 'US Dollars', rate: 0.745 } ] }, exchangeRateCurrency: [ AnonymousModelSubclass { id: 1, code: 'USD', name: 'US Dollars', rate: 0.745 } ] } ] Mikaels-MacBook-Pro-2: mikaelle$ 

看起来像$relatedQuery()也补丁查询对象的Model的关系被请求。