sequelize 管理查詢——一對一關聯查詢

sequelize 提供了兩種一對一關係關聯方法 belongsTo 和 hasOne sql

拿users和userInfo這兩個model來講,首先咱們須要建立這兩個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

相關文章
相關標籤/搜索