sequelize 提供了两种一对一关系关联方法 belongsTo 和 hasOne sql
拿users和userInfo这两个model来讲,首先咱们须要建立这两个model,数据结构
const User = Sequelize.defin('users', { // 建立user model id: { autoIncrement: true, // 自动递增 type: Sequelize.INTEGER, primaryKey: true // 声明主键 }, username: { type: Sequelize.STRING }, password: { type: Sequelize.STRING }, nick_name: { type: Sequelize.STRING }, email: { type: Sequelize.STRING } }); const UserInfo = const UserInfo = db.defineModel('user_info', { // 建立userInfo model id: { autoIncrement: true, // 自动递增 type: Sequelize.INTEGER, primaryKey: true // 声明主键 }, uid: { type: Sequelize.INTEGER, unique: true }, blog_url: { type: Sequelize.STRING }, portrait_url: { type: Sequelize.STRING }, address: { type: Sequelize.STRING } });
// belongsTo User.belongsTo(UserInfo, { foreignKey: 'id', as: 'info' }) //hasOne User.hasOne(UserInfo, { foreignKey: 'uid', as: 'info' })
这两个方法都是两个参数第一个参数为一个Model,第二个为options配置,options经常使用两个属性分别是foreignKey 指定外键,和as 指定别名。
两种方法都是把userInfo表关联到User表,区别是暴露外键的表不一样,belongsTo暴露出的是User表的‘id’字段做为外键去查询UserInfo表,而hasOne方法暴露的是UserInfo表的‘uid’做为外键查询
User.findeOne({ // where: {}, user的查询条件 include: { model: UserInfo, // 关联查询 as: 'info' // 别名 // where: {} // userInfo的查询条件 } })
注意!若是要使用别名,创建关系的时候要在第二个参数下设置as属性,同时在include内设置as属性。as的别名会在获取到的数据结构体现为你设置的别名。
其中belongsTo 生成的sql 以下ui
SELECT `users`.`id`, `users`.`username`, `user_info`.`id` AS `user_info.id`, `user_info`.`address` AS `user_info.address` FROM `users` AS `users` LEFT OUTER JOIN `user_info` AS `user_info` ON `users`.`id` = `user_info`.`id`;
hasOne 生成的sql 以下url
SELECT `users`.`id`, `users`.`username`, `user_info`.`id` AS `user_info.id`, `user_info`.`address` AS `user_info.address` FROM `users` AS `users` LEFT OUTER JOIN `user_info` AS `user_info` ON `users`.`id` = `user_info`.`uid`;
观察这两条sql,LEFT OUTER JOIN user_info
AS user_info
ON users
.id
= user_info
.id
和LEFT OUTER JOIN user_info
AS user_info
ON users
.id
= user_info
.uid
你是否是明白了些什么。
belongsTo 是根据User的外键做为条件去查询UserInfo的主键。hasOne是根据UserInfo的外键做为条件去查询User的主键code