我有两个桌子。 userPermissions和PermissionItems。 userPermissions具有一个PermissionItemId作为外键,定义为
CONSTRAINT `fk_userPermissions_permissionItemId`
FOREIGN KEY (`permissionItemId`)
REFERENCES `mydb`.`permissionItems` (`permissionItemId`)
他们的Sequelize定义是
const PermissionItem = db.define('permissionItems', {
permissionItemId: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
}
});
const UserPermission = db.define('userPermissions', {
userPermissionsId: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
},
permissionItemId: {
type: Sequelize.INTEGER,
references: 'permissionItems',
referencesKey: 'permissionItemId'
}
});
UserPermission.hasOne(PermissionItem);
然后我尝试将两者与一起使用,并使用来查看结果
UserPermission.findAll({
include: [{
model: PermissionItem
}]
}).then(userPermission => {
console.log('userPermission', userPermission);
});
我在这里的期望是获取所有UserPermissions的列表,以及对PermissionItemId的外部左连接PermissionItem。相反,我收到以下错误
未处理的拒绝SequelizeDatabaseError:未知列 “字段列表”中的“ permissionItem.userPermissionUserPermissionsId”
我构造的查询不正确吗?还是Sequelize的定义?
我尝试过将它们翻转并包括反向操作,并以我能想到的每种组合将键向后应用,但都无济于事
答案 0 :(得分:0)
在您的userPermissions
模型中,
代替这个
UserPermission.hasOne(PermissionItem);
尝试
UserPermission.belongsTo(PermissionItem,{foreignKey:'permissionItemId'});
HasOne和Belongs在不同模型中插入关联密钥 彼此。 HasOne将关联密钥插入目标模型 而BelongsTo将关联密钥插入源模型。
答案 1 :(得分:0)
我最终将UserPermission更改为以下内容。看起来我不需要为数据库中的现有外键在Sequelize模型中定义任何特殊的东西,只需要在hasOne调用中列出它
UserPermission = db.define('userPermissions', {
userPermissionsId: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
},
permissionItemId: {
type: Sequelize.INTEGER
}
});
UserPermission.hasMany(PermissionItem, { foreignKey: 'permissionItemId', sourceKey: 'permissionItemId' });
答案 2 :(得分:0)
每当我想要建立关联时,通常都会在两个模型中都定义并分配别名,以便更好地理解和正确配置。
orders.hasMany(models.orderDetails, {
as: 'orderDetails',
foreignKey: 'orderId',
targetKey: 'id', });
orderDetails.belongsTo(models.Orders, {
foreignKey: 'specialOrderId',
targetKey: 'id',
as: 'Orders'
});
每当查询创建或查找:
models.orders.create(ObjectToCreate, {
include: [{ model: models.orderDeatils, as: 'orderDeatils' }],
});
models.orders.findAll({ where: { id: 3}}, {
include: [{ model: models.orderDeatils, as: 'orderDeatils' }],
});