【问题标题】:Creating Knex Migration Referencing the Same Table Twice创建两次引用同一个表的 Knex 迁移
【发布时间】:2020-03-07 02:53:09
【问题描述】:

尝试在引用买家和卖家 s.t. 的 postgresql 数据库中创建表 Transaction。两者都是用户表中的对象。

我认为我的迁移工作看起来如下所示:

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 属于买方和卖方,它们都是 User 类的成员。

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

这是我的交易模型:

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

我已经想通了。上面的代码工作,使用别名买家和卖家,并将这两种类型的用户与交易相关联。

【问题讨论】:

  • 澄清问题:您的意思是“我如何编写使用此表的查询”?
  • 啊,感谢您添加objection.js 标签和附加代码。看起来你解决了自己的问题,很好!您可能希望将您的代码添加为接受的答案,以防其他人也在为类似的事情而苦苦挣扎:)

标签: postgresql foreign-keys database-migration knex.js objection.js


【解决方案1】:

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

这是为买家和卖家设置列的迁移,它们都引用同一个用户表:

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;

最后,这里是返回所有事务的快速路由,包括预先加载相关模型:

let router = express.Router();

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

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2022-01-27
    相关资源
    最近更新 更多