首页 > 解决方案 > 能够使用关联进行迁移,但无法使用关联进行查询(未找到关联)

问题描述

我已经建立了一个数据库,其中包含几个相互关联的表:Auction 和 Bids。每个拍卖应该有多个投标,每个投标应该只有一个拍卖。我进行了迁移以添加foreignKeys,但是当我尝试在拍卖中查找某个出价时,我收到一个SequelizeEagerLoadingError: Bids is not associated to Auctions!错误。

迁移文件:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.addColumn(
      'Auctions', // name of target model
      'BidId',
      {
        type: Sequelize.INTEGER,
        references:{
          model: "bids",
          key: "bid_id",
        },
      },
    );
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Auction');
  }
};

出价.js

const Sequelize = require('sequelize');


// const resolver = require('graphql-sequelize');
const sequelize = require('../config/database');
const Auction = require('./Auction');

const tableName = 'bids';
const Bids = sequelize.define('Bids', {
  bid_id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  createdAt: {
   type: Sequelize.DATE,
   // defaultValue: Sequelize.NOW
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  amount: {
    type: Sequelize.INTEGER
  },
  bid_amount: {
    type:Sequelize.STRING
  },
  bid_no: {
    type: Sequelize.UUID,
    defaultValue: Sequelize.UUIDV4,
  },
}, 
{tableName})

Bids.associate = () => {
  Bids.hasOne(Auction, {foreignKey:"BidId"})
};

拍卖.js

const Sequelize = require('sequelize');
const sequelize = require('../config/database');
const tableName = 'Auctions';
const Auction = sequelize.define('Auctions', {
  auc_id: {
    type: Sequelize.UUID,
    defaultValue: Sequelize.UUIDV4, // generate the UUID automatically
    primaryKey: true,
  },
  features: {
    type: Sequelize.JSONB,
  },
  bid_amount: {
    type:Sequelize.STRING
  },
  BidId: {
    type: Sequelize.UUID,
  }
}, { tableName });

Auction.hasMany(Bids, {foreignKey: 'BidId'}) 

module.exports = Auction

查询.js

const findBidOnAuction = () => {Auction.findOne({where:{BidId:2}, include:[{model:Bids}]}).then(data => console.log("result", data))}

如何正确关联这些表?

编辑:同样在 pgAdmin 上,我可以认为这种关系存在,BidId 是拍卖中的外键,链接到 Bids 上的 bid_id

标签: mysqlnode.jssequelize.js

解决方案


我执行以下操作以在迁移中添加外键:

ref1.我用一个函数为父模型创建一个迁移。const TABLE_NAME = '父';

function up(queryInterface, Sequelize) {
  return queryInterface.createTable(
    TABLE_NAME, //Bid model
    {
      //attributes
    },
  );
}

function down(queryInterface, Sequelize) {
  return queryInterface.dropTable(TABLE_NAME);
}

function ref(Sequelize) {
  return {type: Sequelize.STRING(2), references: {model: TABLE_NAME, key: 'id'}}; // 'id' here is your parent (Bids) primary key
}

module.exports = {up, down, ref};

2.在要添加引用的子模型上,导入ref函数并像这样添加,因此您的迁移实际上知道您引用的是哪个模型:

const {ref: REF_Model} = require('name-of-your-migration-file'); //import model


  async function up(queryInterface, Sequelize){
    await queryInterface.addColumn('Auctions', 'BidId', {...REF_Model(Sequelize), allowNull: true});
  }

  async function down(queryInterface){
    await queryInterface.removeColumn('Auctions', 'BidId');
  }

module.exports = {up, down};

推荐阅读