1
votes

I am having problem with getting user orders using include in .findOne method. The SQL query is correct and its returning 50 rows but sequelize is giving me array with one object containing empty values:

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

There are my models:

  • User:
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;
};
  • Order:
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;
};

In my API i want to get user and his orders. So in the controller i am doing:

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

For the include sequelize does this query:

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

When i execute it i successfully get 50 rows but when i console log user.dataValues I get:

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

When I do user.getOrders() it is successfully giving me user orders but the query is a bit different than include query:

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

So I also don't understand why this query is using "=" but query from include is using "IN()"

1

1 Answers

0
votes
//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();

I think you are confused with SequlizeJson Objects you are getting inside orders array, you can use raw :true and nest : true :

Try to run below query

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