Проблемы понимания ассоциаций в Sequelize для энергичной загрузки

0

Я пытаюсь понять, как сиквелиз делает активную загрузку и почему он не работает для меня.

Предположим, я создаю следующие таблицы с помощью команды seelize migrate:

Таблица пользователей:

return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      .... other columns
}

Таблица элементов:

return queryInterface.createTable('Items', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        }, 
        insertUserId: {
            allowNull: false,
            type: Sequelize.INTEGER,
            onDelete: 'CASCADE',
            onUpdate: 'CASCADE',
            references: {
                model: 'Users',
                key: 'id',
                as: 'insertUserId'
            }
        },
        ..... some other columns 
}

Модель предметов (эта ассоциация работает отлично):

module.exports = (sequelize, DataTypes) => {
  const Item = sequelize.define('Item', {
  .... configuration of columns
  });

  Item.associate = (models) => {
   Item.belongsTo(models.User, {
    as: 'insertUser'
   });
  };

  Item.associate = (models) => {
    Item.belongsTo(models.User, {
      as: 'editUser'
  });

  return Item;
};

Пользователи модели (что сложная часть для меня):

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    .... configuration of columns
  });

  User.associate = (models) => {
        - TRICKY ASSOCIATION - 
  };

  return User;
};

Моя цель:

Я хочу, чтобы все элементы с включенными пользователями в itemController (что работает), но я также хочу, чтобы все пользователи и все связанные элементы в userController (LEFT JOIN, правильно?). Желающая загрузка может это сделать (я прав?)

желаемый выход:

{ 
 id: '0',
 name: 'username', 
 insertedItems: [
  { <item_1> },
  { <item_n> }
 ]
}

UserController

function getUsersItems(year) {
    return User.findAll({
        include: [{
            model: Item,
            as: 'insertedItems'
        }],
        attributes: ['id', 'name']
    });
}

Я попробовал следующее в пользовательской модели:

User.associate = (models) => {
    User.hasMany(models.Item, {
        as: 'insertedItems',
        foreignKey: 'id'
    });
};

Поскольку я правильно понял документы, "hasMany" - это правильная вещь для использования здесь. Важен также псевдоним ("insertItems"). Я что-то упускаю?

Im использует sequelize 4.15.0 и nodejs 9.2.0.

Спасибо вам, ребята

Теги:
sequelize.js

1 ответ

0
Лучший ответ

Я нашел решение самостоятельно.

Поскольку у меня есть Элементы, связанные с несколькими пользователями (insertUser, editUser), мне нужно указать правильный файл foreignkey

User.hasMany(models.Item, {
    as: 'items',
    foreignKey: 'insertUserId'
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню