首页 > 解决方案 > HasOne和belongsTo关系在同一个模型sequelize

问题描述

我正在使用 sequelize 和 nodejs,并且在建立关系时遇到了困难。

我有 3 张桌子(本地、设备、棚子、区域),在一个地方我有 1 个设备,它在一个棚子里,属于一个区域。

模型如下所示:

当地的:

import { Sequelize, DataTypes } from 'sequelize';

export default (sequelize, dataTypes) => {
const model = sequelize.define('local', {
    id: {
        type: dataTypes.STRING(200),
        primaryKey: true,
        allowNull: false,
        required: true,
        unique: true
    },
    name: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    idEquipment: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    idShed: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    idArea: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    situation: {
        type: dataTypes.BOOLEAN,
        allowNull: false,
        required: true,
        defaultValue: true
    },
    capacity: {
        type: dataTypes.FLOAT,
        allowNull: false,
        required: true
    },
    posX: {
        type: dataTypes.STRING,
        allowNull: false,
        required: true
    },
    posY: {
        type: dataTypes.STRING,
        allowNull: false,
        required: true
    },
    posZ: {
        type: dataTypes.STRING,
        allowNull: false,
        required: true
    },
    status: {
        type: dataTypes.BOOLEAN,
        allowNull: true,
        defaultValue: true
    }
}).schema('public');

model.associate = (models) => {
    model.belongsTo(models.area, {
        foreignKey: 'idArea'
    });

    model.belongsTo(models.equipment, {
        foreignKey: 'idEquipment'
    });

    // model.belongsTo(models.shed, {
    //     foreignKey: 'idShed'
    // });
};

return model;

};[]

设备:

import { Sequelize, DataTypes } from 'sequelize';

export default (sequelize, dataTypes) => {
const model = sequelize.define('equipment', {
    id: {
        type: dataTypes.STRING(200),
        primaryKey: true,
        allowNull: false,
        unique: true,
        required: true
    },
    description: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    idArea: {
        type: dataTypes.STRING(200),
        allowNull: true,
        required: false
    },
    idHangar: {
        type: dataTypes.STRING(200),
        allowNull: true,
        required: false
    },
    idControlPlan: {
        type: dataTypes.STRING(200),
        allowNull: true,
        required: false
    },
    dateControlPlan: {
        type: dataTypes.DATE,
        allowNull: true,
        required: false
    },
    idUserControlPlan: {
        type: dataTypes.STRING(200),
        allowNull: true,
        required: false
    },
    status: {
        type: dataTypes.BOOLEAN,
        allowNull: true,
        defaultValue: true
    }
}).schema('public');

model.associate = (models) => {
    model.hasOne(models.local, {
        foreignKey: 'idEquipment'
    });
};

return model;
};

棚:

import { Sequelize, DataTypes } from 'sequelize';

export default (sequelize, dataTypes) => {
const model = sequelize.define('shed', {
    id: {
        type: dataTypes.STRING(200),
        primaryKey: true,
        allowNull: false,
        unique: true,
        required: true
    },
    idArea: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    description: {
        type: dataTypes.STRING(200),
        allowNull: false,
        required: true
    },
    status: {
        type: dataTypes.BOOLEAN,
        allowNull: true,
        defaultValue: true
    }
}).schema('public');

model.associate = (models) => {
    // model.hasOne(models.local, {
    //     foreignKey: 'idShed'
    // });

    model.belongsTo(models.area, {
        foreignKey: 'idArea'
    });
};

return model;

};

区域:

import { Sequelize, DataTypes } from 'sequelize';

export default (sequelize, dataTypes) => {
const model = sequelize.define('area', {
    id: {
        type: dataTypes.STRING(200),
        primaryKey: true,
        allowNull: false,
        unique: true,
        required: true
    },
    description: {
        type: dataTypes.STRING,
        unique: true,
        allowNull: false,
        required: true
    },
    status: {
        type: dataTypes.BOOLEAN,
        allowNull: true,
        defaultValue: true
    }
}).schema('public');

model.associate = (models) => {
    model.belongsToMany(models.company, {
        through: 'companyArea',
        foreignKeyConstraint: true,
        foreignKey: 'idArea'
    });

    model.hasOne(models.shed, {
        foreignKey: 'idArea'
    });

    model.hasOne(models.local, {
        foreignKey: 'idArea'
    });
};

return model;

};

当我添加棚关系时,它告诉我没有关系,拍摄时一切都会正常:

[SQL 错误] SequelizeDatabaseError: 关系“public.sheds”不存在退出 [SQL 错误] 关系“public.sheds”不存在退出

我正在使用 postgres 数据库。

那可能是哪里的错误,会是写作错误吗?或者一个模板不能同时有belongsTo和hasOne关系?

标签: javascriptnode.jssequelize.js

解决方案


推荐阅读