如何在 Sequelize 中通过外键关联两个表格
Sequelize 是一个 Node.js ORM(Object-Relational Mapper),它支持多个数据库,如 MySQL、Postgres、SQLite 和 MSSQL。在 Sequelize 中,关联是指两个表之间的连接,通过一个表的列与另一个表中的列匹配来设置关系。这里我们将演示如何在 Sequelize 中通过外键关联两个表格。
第一步:建立模型
首先,我们需要为两个相关的模型创建模型。在这个例子中,我们将创建两个模型,一个是用户(User) 模型,另一个是订单(Order) 模型。用户模型如下:
// www.javascriptcn.com code example
const { Model, DataTypes } = require('sequelize');
const sequelize = require('../sequelize');
class User extends Model {}
User.init({
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
username: {
type: DataTypes.STRING,
allowNull: false
}
}, { sequelize, modelName: 'user' });
module.exports = User;订单模型如下:
// www.javascriptcn.com code example
const { Model, DataTypes } = require('sequelize');
const sequelize = require('../sequelize');
class Order extends Model {}
Order.init({
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
amount: {
type: DataTypes.INTEGER,
allowNull: false
}
}, { sequelize, modelName: 'order' });
module.exports = Order;我们需要在每个模型中定义一个主键(id),并且指定模型与 Sequelize 实例(sequelize) 和模型名称(modelName)之间的连接。
第二步:添加关联
我们的订单模型需要一个外键,指向用户模型的主键。我们可以在模型定义中添加一个外键,来实现这一点。需要注意的是,我们需要在定义时指示 Sequelize 引擎,订单模型与用户模型之间的联系并且是一对多的模型。
在 Order 模型中增加 userId 属性,这个属性会与 User 模型中的 id 属性关联起来。
// www.javascriptcn.com code example
const { Model, DataTypes } = require('sequelize');
const sequelize = require('../sequelize');
const User = require('./user');
class Order extends Model {}
Order.init({
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
amount: {
type: DataTypes.INTEGER,
allowNull: false
},
userId: {
type: DataTypes.INTEGER,
references: {
model: User, // 引用的模型
key: 'id' // 引用的列
},
allowNull: true
}
}, { sequelize, modelName: 'order' });
User.hasMany(Order);
Order.belongsTo(User);
module.exports = Order;在这里,我们添加了一个 userId 属性,这个属性是一个整数,并且允许为空(null)。references 属性指定了关联的模型和列。此外,为了建立正向和反向关联关系,在两个相关的模型之间添加 hasMany 和 belongsTo。
第三步:使用关联
完成前两步后,我们可以通过使用 Sequelize 提供的内置方法来查询和操作关联的数据。
查询指定用户所有的订单:
// www.javascriptcn.com code example
const User = require('../models/user');
const Order = require('../models/order');
User.findOne({
where: { id: 1 },
include: [Order]
}).then(user => {
console.log(user.toJSON());
});查询指定订单的用户信息:
// www.javascriptcn.com code example
const User = require('../models/user');
const Order = require('../models/order');
Order.findOne({
where: { id: 1 },
include: [User]
}).then(order => {
console.log(order.toJSON());
});在这里,我们通过每个模型中定义的关联属性(User.hasMany(Order)和Order.belongsTo(User))来查询和操作关联的数据。include 选项允许我们查询关联的数据。
通过这篇文章的指导和学习,我们可以成功地在 Sequelize 中通过外键关联两个表格。这样可以更方便地存储和查询数据。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6bab1a941bf7134c9583f