Я пытаюсь понять, как сиквелиз делает активную загрузку и почему он не работает для меня.
Предположим, я создаю следующие таблицы с помощью команды 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.
Спасибо вам, ребята
Я нашел решение самостоятельно.
Поскольку у меня есть Элементы, связанные с несколькими пользователями (insertUser, editUser), мне нужно указать правильный файл foreignkey
User.hasMany(models.Item, {
as: 'items',
foreignKey: 'insertUserId'
});