Sequelize model Include возвращает массив с одним объектом, содержащим пустые значения.

У меня возникла проблема с получением пользовательских заказов с использованием метода включения в .findOne. SQL-запрос правильный и возвращает 50 строк, но сиквелизация дает мне массив с одним объектом, содержащим пустые значения:

  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';

Поэтому я также не понимаю, почему этот запрос использует "=", но запрос из include использует "IN()"


person Szymon Sus    schedule 09.09.2019    source источник


Ответы (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 :true и nest : true :

Попробуйте выполнить запрос ниже

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