创建引用相同 Table 两次的 Knex 迁移

Creating Knex Migration Referencing the Same Table Twice

正在尝试在引用买家和卖家的 postgresql 数据库中创建 table 交易 s.t。两者都是来自用户 table.

的对象

我想我的迁移工作看起来像下面这样:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('likes', t => {
    t.increments('id').primary()
    t.integer('buyers_id').references('users.id').onDelete('CASCADE')
    t.integer('sellers_id').references('users.id').onDelete('CASCADE')

    ...

    t.datetime("created_at");
    t.datetime("updated_at");
  })
};

接下来,我需要管理模型中的关联,s.t Transaction 属于 Buyer 和 Seller,它们都是 User class.

的成员

为了澄清问题,我可以使用这些属性创建模型,但关联似乎不起作用。

这是我的交易模型:

const BaseModel = require("./BaseModel");

// const Password = require('objection-password')();

class Transaction extends BaseModel {
  static get tableName() {
    return "transactions";
  }

  static get relationMappings () {
    const User = require('./User');
    const Item = require('./Item')
    return {
      buyer: {
        relation: BaseModel.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: 'transactions.buyers_id',
          to: 'users.id'
        }
      },
      seller: {
        relation: BaseModel.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: 'transactions.sellers_id',
          to: 'users.id'
        }
      }, 
      books: {
        relation: BaseModel.BelongsToOneRelation,
        modelClass: Item,
        join: {
          from: 'transactions.items_id',
          to: 'items.id'
        }
      }
    }
  }
}

module.exports = Transaction;

这是我尝试加载买家的相关路线:

let router = express.Router();

router.get('/', async (req, res) => {
  const transactions = await Transaction
    .query()
    .eager(['buyer', 'items')
  res.json(transactions);
});

我已经弄明白了。上面的代码有效,使用别名买家和卖家并将这两种类型的用户与交易相关联。

对于任何有兴趣的人...整合上面的工作解决方案,使用 Node/ExpressJS 用于服务器,Postgresql 用于数据库,KnexJS/ObjectiveJS 用于管理模型和查询。

这是为买家和卖家设置列的迁移,两者都引用相同的用户 table:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('likes', t => {
    t.increments('id').primary()
    t.integer('buyers_id').references('users.id').onDelete('CASCADE')
    t.integer('sellers_id').references('users.id').onDelete('CASCADE')

    ...

    t.datetime("created_at");
    t.datetime("updated_at");
  })
};

这是包含关联的交易模型 s.t。交易属于项目买方(用户)和卖方(用户)和项目:

const BaseModel = require("./BaseModel");

// const Password = require('objection-password')();

class Transaction extends BaseModel {
  static get tableName() {
    return "transactions";
  }

  static get relationMappings () {
    const User = require('./User');
    const Item = require('./Item')
    return {
      buyer: {
        relation: BaseModel.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: 'transactions.buyers_id',
          to: 'users.id'
        }
      },
      seller: {
        relation: BaseModel.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: 'transactions.sellers_id',
          to: 'users.id'
        }
      }, 
      books: {
        relation: BaseModel.BelongsToOneRelation,
        modelClass: Item,
        join: {
          from: 'transactions.items_id',
          to: 'items.id'
        }
      }
    }
  }
}

module.exports = Transaction;

最后,这是 returns 所有交易的快速路线,包括预加载相关模型:

let router = express.Router();

router.get('/', async (req, res) => {
  const transactions = await Transaction
    .query()
    .eager(['buyer', 'items')
  res.json(transactions);
});