问题描述
我有两个表,apps
和 services
.在 services
上,PRIMARY KEY 设置为名为 orn
的字段.我在这两个表之间创建了一个名为 apps_services
的直通表,其中包含 appId
和 serviceId
I have two tables, apps
and services
. On services
the PRIMARY KEY is set to field called orn
.I created a through table between these two tables called apps_services
with appId
and serviceId
appId: {
type: Sequelize.UUID,
references: {
model: 'apps',
key: 'id'
}
},
serviceId: {
type: Sequelize.STRING,
references: {
model: 'services',
key: 'orn'
}
},
但是这里有一个问题,当我使用 app.addService(foundService);
(这会在该应用程序实例和 foundService 之间创建一个关系).当我使用节点调试器时,我发现 sequelize 尝试将 id
插入 serviceId
而不是 orn
But here is a problem, when i use app.addService(foundService);
(this creates a relationship between that app instance and foundService). When i used node debugger, i found out that sequelize tried inserting an id
into serviceId
instead of an orn
Executing (default): INSERT INTO "apps_services" ("id","appId","serviceId","createdAt","updatedAt") VALUES ('8d85f9b9-b472-4165-a345-657a0fe0d8ad','49f3daa4-1df4-4890-92f8-9a06f751ffb7','8cab340d-d11b-4e3b-842c-aeea9a28c368','2021-02-16 00:22:17.919 +00:00','2021-02-16 00:22:17.919 +00:00') RETURNING "id","appId","serviceId","userId","selfGranted","createdAt","updatedAt";
括号中的第三个值,问题是id
不是foreignKey而是orn
是
the third value in the bracket, the problem is id
is not the foreignKey but orn
is
下面是service
表,我们可以看到orn
列,这是链接到apps_services表的PRIMARY KEY和外键.
below is the service
table, we can see the orn
column, which is the PRIMARY KEY and foreign key linking to the apps_services table.
有没有办法强制 sequelize 使用 orn
字段?
Is there a way to force sequelize to use the orn
field?
module.exports = (sequelize, DataTypes) => {
const apps_services = sequelize.define('apps_services', {
id: {
type: DataTypes.UUID,
defaultValue: new DataTypes.UUIDV4(),
unique: true,
primaryKey: true
},
appId: {
type: DataTypes.UUID,
},
serviceId: {
type: DataTypes.STRING,
},
userId: {
type: DataTypes.UUID
},
selfGranted: DataTypes.BOOLEAN
}, {
timestamps: true
});
apps_services.associate = function (models) {
models.apps.belongsToMany(models.services, {
through: apps_services
});
models.services.belongsToMany(models.apps, {
through: apps_services
});
};
//apps_services.sync({alter: true});
return apps_services;
};
//这是 apps_services 迁移
// this is apps_services migration
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('apps_services', {
id:{
type: Sequelize.UUID,
defaultValue: new Sequelize.UUIDV4(),
unique: true,
primaryKey: true
},
appId: {
type: Sequelize.UUID,
references: {
model: 'apps',
key: 'id'
}
},
serviceId: {
type: Sequelize.STRING,
references: {
model: 'services',
key: 'orn'
}
},
userId: {
type: Sequelize.UUID,
references: {
model: 'Users',
key: 'id'
}
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
},
selfGranted: Sequelize.BOOLEAN,
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('apps_services');
}
};
下面是服务表
推荐答案
是的,您可以从对面的表格中提及要使用的字段.
Yes you can mention which field to use from the opposite table.
apps_services.associate = function (models) {
// you can move this association to apps model file
models.apps.belongsToMany(models.services, {
// Reference: https://sequelize.org/master/class/lib/model.js~Model.html#static-method-belongsToMany
through: 'apps_services',
foreignKey: 'appId', // <-- add this
});
// you can move this association to services model file
models.services.belongsToMany(models.apps, {
through: 'apps_services',
foreignKey: 'serviceId', // <-- add this - name of field in through table
otherKey: 'orn', // <-- add this - name of field in source table
});
/**
* new relation below just to complete the Many to Many relation
*/
// you can add this association in app_services model file
models.apps_services.belongsTo(models.services, {
// Reference: https://sequelize.org/master/class/lib/model.js~Model.html#static-method-belongsTo
foreignKey: 'serviceId', // <--- name of field in source table
targetKey: 'orn', // <--- name of field in target table
});
// you can add this association in app_services model file
models.apps_services.belongsTo(models.apps, {
foreignKey: 'appId', // <--- name of field in source table
// targetKey: 'id', //(not needed as already primary key by default) <--- name of field in target table
});
};
这篇关于使用直通表更改 Sequelize 默认外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!