【问题标题】:Association is using wrong column关联使用了错误的列
【发布时间】:2020-01-11 04:44:50
【问题描述】:

我正在使用没有创建外键的现有数据库,但我可以使用 sql 查询连接两个表,但我无法在 sequelize 中加入它们。

有两种型号: - 用户:

module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define('User', {
    steamid: DataTypes.STRING,
    name: DataTypes.STRING,
    img: DataTypes.STRING,
    tradelink: DataTypes.STRING,
    ban_chat: DataTypes.INTEGER,
    block_sms: DataTypes.INTEGER,
    balance: DataTypes.INTEGER,
    ref: DataTypes.STRING,
    refcode: DataTypes.STRING,
    ip_address: DataTypes.STRING
  }, {
    timestamps: false
  });
  User.associate = function(models) {
    // associations can be defined here
    User.hasMany(models.Order,{
      foreignKey: 'steamid',
      as: 'orders'
    });

  };
  return User;
};
  • 订单:
const customDataTypes = require('../../core').SequelizeTimestamp;

module.exports = (sequelize, DataTypes) => {
  var Order = sequelize.define('Order', {
    steamid: DataTypes.STRING,
    item_name: DataTypes.STRING,
    price: DataTypes.FLOAT,
    type: DataTypes.STRING,
    website: DataTypes.STRING,
    amount: DataTypes.INTEGER,
    status: DataTypes.INTEGER,
    img: DataTypes.STRING,
    send_attempts: DataTypes.INTEGER,
    message: DataTypes.STRING,
    date: customDataTypes.TIMESTAMP,
  }, {
    timestamps: false
  });
  Order.associate = function(models) {
    // associations can be defined here
    Order.belongsTo(models.User, {
      foreignKey: 'steamid',
      as: 'user'
    })
  };
  return Order;
};

在我的 API 中,我想获取用户和他的订单。 所以在我正在做的控制器中:

user.findOne({
      where: { steamid: req.params.steamId },
      include: [{
        model: order,
        as: 'orders',
        limit: 50
      }],
    })

所以我希望在响应中有用户订单数组,但由于某种原因我得到了空订单数组。

Sequelize 正在做这两个查询:

SELECT `User`.`id`, `User`.`steamid`, `User`.`name`, `User`.`img`, `User`.`tradelink`, `User`.`ban_chat`, `User`.`block_sms`, `User`.`balance`, `User`.`ref`, `User`.`refcode`, `User`.`ip_address` FROM `Users` AS `User` WHERE `User`.`steamid` = '1234' LIMIT 1;

这是成功找到用户但第二个查询不正确:

SELECT `id`, `steamid`, `item_name`, `price`, `type`, `website`, `amount`, `status`, `img`, `send_attempts`, `message`, `date` FROM `Orders` AS `Order` WHERE `Order`.`steamid` IN (1) LIMIT 50;

这部分不正确“WHERE Order.steamid IN (1)” 它正在寻找 steamid 为 = 1 的订单,这是用户 id(主键),但它应该是用户 steamid,即“1234”

我的关联有什么问题?

【问题讨论】:

标签: node.js sequelize.js


【解决方案1】:

如果 steamid 不是主要的,你不应该使用“targetKey”和“sourceKey”吗?

https://sequelize.org/master/manual/associations.html

   Order.belongsTo(models.User, {
      foreignKey: 'steamid',
      targetKey: 'steamid',
      as: 'user'
    })
    Order.belongsTo(models.User, {
      foreignKey: 'steamid',
      sourceKey: 'steamid',
      as: 'user'
    })

【讨论】:

  • 你是对的,现在查询是正确的,但是由于某种原因,当我 console.log(user.orders) 它给了我带有空数据值的 Order 对象:{} 但查询返回 50 行
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多