在 Web 应用程序的开发中,多对一关系是很常见的,例如,一个订单可以对应一个用户,一个评论可以对应一个文章等等。在 ORM 工具 Sequelize 中,可以很方便地实现多对一关系。
关系类型
在 Sequelize 中,多对一关系有四种类型:
- BelongsTo:属于关系,例如,订单属于用户;
- HasOne:拥有关系,例如,用户拥有订单;
- HasMany:拥有多个关系,例如,文章有多条评论;
- BelongsToMany:属于多个关系,例如,学生属于多个班级。
在本文中,我们重点介绍 BelongsTo 关系类型的实现方法。
Sequelize 模型
在 Sequelize 中,每个数据库表都需要对应一个模型(Model),模型中定义了表中的各字段和关系。下面是一个 User 和 Order 两个模型的定义方式:
// javascriptcn.com 代码示例 // User 模型定义 const User = sequelize.define('user', { username: Sequelize.STRING, email: Sequelize.STRING }); // Order 模型定义 const Order = sequelize.define('order', { order_no: Sequelize.STRING, amount: Sequelize.INTEGER });
BelongsTo 关系
BelongsTo 关系是属于关系,例如,订单属于用户。在 Sequelize 中,实现 BelongsTo 关系需要在 Order 模型中,定义一个 userId 字段,并通过 belongsTo() 方法关联 User 模型。
// javascriptcn.com 代码示例 // Order 模型中定义 userId 字段 const Order = sequelize.define('order', { order_no: Sequelize.STRING, amount: Sequelize.INTEGER, userId: Sequelize.INTEGER }); // Order 模型关联 User 模型 Order.belongsTo(User);
在上面的代码中,belongsTo() 方法将 Order 模型关联到 User 模型上。这样,Order 模型就可以通过 userId 关联到 User 模型,实现了多对一关系。
查询关联数据
通过定义 BelongsTo 关系之后,你可以很方便地查询关联数据。例如,查询某个订单的用户信息:
Order.findOne({ where: { order_no: '123456' }, include: User }).then(order => { console.log('订单号:' + order.order_no); console.log('订单金额:' + order.amount); console.log('用户姓名:' + order.user.username); });
在上面的查询中,include 参数指定要查询的关联模型,这里传入 User,表示要查询订单的用户信息。查询结果中,order.user 实际上是一个 User 模型实例,可以通过它来访问用户信息。
修改关联数据
如果需要修改关联数据,例如,将某个订单的用户改为某个其他用户:
// javascriptcn.com 代码示例 Order.findOne({ where: { order_no: '123456' }, include: User }).then(order => { User.findOne({ where: { username: 'newuser' } }) .then(user => { order.user = user; order.save(); }); });
在上面的代码中,先查询出订单和要关联的用户,在将 order.user 设置为 user,然后调用 save() 方法将修改保存到数据库。
总结
在 Sequelize 中,实现多对一关系很简单,只需要通过定义关联字段和关联方法,就可以创建 BelongsTo 关系。然后,通过 include 参数就可以查询关联模型的数据,也可以修改关联数据。本文只介绍了 BelongsTo 关系类型的实现方法,其他关系类型的使用方法也类似。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6538e7777d4982a6eb210a75