【问题标题】:Sequelize model Include returns an array with one object containing empty valuesSequelize 模型 Include 返回一个数组,其中一个对象包含空值
【发布时间】:2020-01-11 09:17:36
【问题描述】:

我在使用 include in .findOne 方法获取用户订单时遇到问题。 SQL 查询是正确的,它返回 50 行,但 sequelize 给了我一个包含空值的对象的数组:

  orders:
   [ Order {
       dataValues: {},
       _previousDataValues: {},
       _changed: {},
       _modelOptions: [Object],
       _options: [Object],
       __eagerlyLoadedAssociations: [],
       isNewRecord: false } ]

有我的模型:

  • 用户:
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',
      sourceKey: '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',
      targetKey: 'steamid',
      as: 'user'
    })
  };
  return Order;
};

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

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

对于包含续集执行此查询:

SELECT `id`, ... FROM `Orders` AS `Order` WHERE `Order`.`steamid` IN ('123456') LIMIT 50;

当我执行它时,我成功获得了 50 行,但是当我在控制台登录 user.dataValues 时,我得到:

{ id: 1,
  steamid: '123456',
  name: 'TEST',
  img: null,
  balance: 40575,
  orders:
   [ Order {
       dataValues: {},
       _previousDataValues: {},
       _changed: {},
       _modelOptions: [Object],
       _options: [Object],
       __eagerlyLoadedAssociations: [],
       isNewRecord: false } ] }

当我执行user.getOrders() 时,它成功地给了我用户订单,但查询与包含查询有点不同:

SELECT `id`, ... FROM `Orders` AS `Order` WHERE `Order`.`steamid` = '123456';

所以我也不明白为什么这个查询使用“=”但是来自包含的查询使用“IN()”

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:
    //this will get json result from your already executed sequlize query, as you can see in your output 
    user.dataValues;
    
    //this will run the query to get al the order of user you found from the query output
    user.getOrders();
    

    我认为您对您在订单数组中获取的 SequlizeJson 对象感到困惑,您可以使用 raw :truenest : true

    尝试在查询下方运行

    user.findOne({
      where: { steamid: req.params.steamId },
      include: [{
        model: order,
        as: 'orders',
        limit: 50
      }],
      raw:true, // <----- HERE
      nest:true // <----- HERE
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2020-05-06
      • 2019-04-23
      • 2018-12-29
      • 2010-11-18
      • 2014-07-29
      • 1970-01-01
      相关资源
      最近更新 更多