Я использую функцию getOne()
для извлечения пользовательских данных с соответствующими моделями. Если я использую PK
в предложении where
следующим образом: where: { ID: 128 }
- он работает нормально . Это означает, что ассоциации и настройки запросов верны.
Но если я пытаюсь найти пользователя по полю email
, например: where: { email: 'email_of@user_with_ID_128.com' }
- Sequelize выдает ошибку Unknown column (...) in field list
для полей самого глубокого связанные модели. Адрес электронной почты правильный, и он указывает на того же пользователя, что и поиск по идентификатору. Если я исключаю связи из конфигурации запроса или задаю required: false
- запрос успешен, и пользователь может быть найден с помощью email
.
Это строка запроса:
return models.User.findOne(config).then(user => { console.log(user) });
И объект options / config:
config = {
where: { ID: 128 }, // THIS WORKS
// OR
where: { email: 'email_of@user_with_ID_128.com' }, // THIS THROWS ERROR
include: [
{
nested: true,
model: models.UserComponent,
attributes: ['ID', 'isDisplayed', 'displayIndex'],
include: [
{
model: models.Component,
required: true,
include: [
{
model: models.ComponentType, // error relates to this model
required: true // doesn't throw error if set to false
},
{
model: models.ObjectType, // and error relates to this model
required: true // doesn't throw error if set to false
},
{
model: models.ComponentContent,
required: false
}
]
}
]
}
],
nested: true
};
Определения моделей:
const User = connectionPool.define('user', {
ID: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
name: {
type: Sequelize.STRING,
allowNull: false,
},
email: {
type: Sequelize.STRING,
allowNull: false
},
surname: {
type: Sequelize.STRING,
allowNull: false,
}
});
const Component = connectionPool.define('component', {
ID: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
defaultIsDisplayed: {
type: Sequelize.BOOLEAN,
allowNull: false
},
defaultDisplayIndex: {
type: Sequelize.INTEGER,
allowNull: false
},
obligatory: {
type: Sequelize.BOOLEAN,
allowNull: false,
default: false
}
}, {
defaultScope: {
attributes: {
exclude: ['createdAt', 'updatedAt',
'componentContentID', 'objectTypeID',
'componentTypeID']
}
}
}
);
const UserComponent = connectionPool.define('user_component', {
ID: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
isDisplayed: {
type: Sequelize.BOOLEAN,
allowNull: false
},
displayIndex: {
type: Sequelize.INTEGER,
allowNull: false
}
}, {
defaultScope: {
attributes: { exclude: ['createdAt', 'updatedAt', 'componentID', 'userID', 'ID'] }
}
});
const ComponentType = connectionPool.define('component_type', {
ID: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
name: {
type: Sequelize.STRING,
allowNull: false
}
}, {
defaultScope: {
attributes: { exclude: ['ID', 'createdAt', 'updatedAt'] }
}
});
const ComponentContent = connectionPool.define('component_content', {
ID: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
content: {
type: Sequelize.STRING,
allowNull: false
}
});
Ассоциации:
models.Component.belongsTo(models.ComponentContent, { foreignKey: 'componentContentID', onDelete: 'CASCADE' });
models.Component.belongsTo(models.ComponentType, { foreignKey: 'componentTypeID', onDelete: 'CASCADE' });
models.Component.belongsTo(models.ObjectType, { foreignKey: 'objectTypeID', onDelete: 'CASCADE' });
models.Component.hasMany(models.UserComponent, { foreignKey: 'componentID', onDelete: 'CASCADE' });
models.UserComponent.belongsTo(models.Component, { foreignKey: 'componentID', onDelete: 'CASCADE' });
models.User.hasMany(models.UserComponent, { foreignKey: 'userID', onDelete: 'CASCADE' });
Я не вижу логической причины, по которой в запрос правильно добавляются ассоциации если оператор where
основан на PK
и не может сделать это для другого поля в качестве условия. Документация не дает никаких подсказок. Кто-нибудь знает, что может быть причиной такого поведения? Я хотел бы избежать предварительного поиска user
для ID
или не требовать связанных моделей.