美文网首页nodejs
Sequelize 关联查询

Sequelize 关联查询

作者: narcissus灬 | 来源:发表于2019-07-24 16:20 被阅读0次

    一对一关系

    用户表与用户信息表
    一个用户只有一张用户信息表

    // 用户表
    module.exports = function(sequelize, DataTypes) {
      return sequelize.define('users', {
        id: {
          type: DataTypes.INTEGER,
          allowNull: false,
          primaryKey: true,
          autoIncrement: true
        },
        username: {
          type: DataTypes.STRING,
          allowNull: false
        },
       status: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        password: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        createdAt: {
          type: DataTypes.DATE,
          allowNull: true
        },
        updatedAt: {
          type: DataTypes.DATE,
          allowNull: true
        }
      }, {
        tableName: 'users'
      })
    }
    
    // 用户信息表
    module.exports = function(sequelize, DataTypes) {
      return sequelize.define('user_info', {
        id: {
          type: DataTypes.INTEGER,
          allowNull: false,
          primaryKey: true,
          autoIncrement: true
        },
        user_id: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        birthday: {
          type: DataTypes.STRING,
          allowNull: true
        },
        nickname: {
          type: DataTypes.STRING,
          allowNull: true
        },
        createdAt: {
          type: DataTypes.DATE,
          allowNull: true
        },
        updatedAt: {
          type: DataTypes.DATE,
          allowNull: true
        }
      }, {
        tableName: 'user_info'
      })
    }
    
    // 定义关系
    // 1----1   一对一关系
    User.hasOne(UserInfo, {foreignKey: 'user_id', sourceKey: 'id'})
    UserInfo.belongsTo(User, {foreignKey: 'user_id', targetKey: 'id'})
    // User.hasOne(UserInfo, {foreignKey: 'user_id', sourceKey: 'id', as: 'user_info'})
    // UserInfo.belongsTo(User, {foreignKey: 'user_id', targetKey: 'id', as: 'user_info'})
    
    // 查询
    router.get('/:username', (req, res) => {
      let username = req.params.username
      User.findOne({
        where: {
          username: username
        },
        include: [UserInfo]
        // include: [
        //   {model: UserInfo, as: 'user_info'},
        // ]
        // include: [{all: true}]
      }).then((result) => {
        res.json(result)
      }).catch((err) => {
        res.status(500).send(err)
      });
    })
    

    注意:

    1. 如果在定义关系时,使用as,则在使用include的时候,也需要使用as,且变量需要相同
    2. 如果在定义关系是,没有使用as,则在使用include的时候,不能使用as,可以将模型直接写在数组中或者只使用model,不使用as
    3. 不过怎么定义关系,都可以通过include: [{all: true}]的方式来拿到所有关联的信息

    一对多关系

    给上面的关系增加一个手机表,一个用户可以拥有多个手机

    // 手机表
    module.exports = function(sequelize, DataTypes) {
      return sequelize.define('phone', {
        id: {
          type: DataTypes.INTEGER,
          allowNull: false,
          primaryKey: true,
          autoIncrement: true
        },
        user_id: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        name: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        createdAt: {
          type: DataTypes.DATE,
          allowNull: true
        },
        updatedAt: {
          type: DataTypes.DATE,
          allowNull: true
        }
      }, {
        tableName: 'phone'
      });
    };
    
    // 定义关系
    // 1----n   一对多关系
    User.hasMany(Phone, {foreignKey: 'user_id', sourceKey: 'id'})
    Phone.belongsTo(User, {foreignKey: 'user_id', targetKey: 'id'})
    // User.hasMany(UserInfo, {foreignKey: 'user_id', sourceKey: 'id', as: 'phone'})
    // Phone.belongsTo(User, {foreignKey: 'user_id', targetKey: 'id', as: 'phone'})
    
    // 查询
    router.get('/:username', (req, res) => {
      let username = req.params.username
      User.findOne({
        where: {
          username: username
        },
        include: [UserInfo, Phone]
        // include: [
        //   {model: UserInfo, as: 'user_info'},
        //   {model: Phone, as: 'phone'},
        // ]
        // include: [{all: true}]
      }).then((result) => {
        res.json(result)
      }).catch((err) => {
        res.status(500).send(err)
      });
    })
    

    多对多关系

    新增课程表course,一门课程有多个学生,一个学生有多门课程
    新增中间表course2student,用来关联学生与课程

    // 课程表
    module.exports = function(sequelize, DataTypes) {
      return sequelize.define('course', {
        id: {
          type: DataTypes.INTEGER,
          allowNull: false,
          primaryKey: true,
          autoIncrement: true
        },
        name: {
          type: DataTypes.STRING,
          allowNull: false
        },
        createdAt: {
          type: DataTypes.DATE,
          allowNull: true
        },
        updatedAt: {
          type: DataTypes.DATE,
          allowNull: true
        }
      }, {
        tableName: 'course'
      });
    };
    
    module.exports = function(sequelize, DataTypes) {
      return sequelize.define('course2student', {
        id: {
          type: DataTypes.INTEGER,
          allowNull: false,
          primaryKey: true,
          autoIncrement: true
        },
        user_id: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        course_id: {
          type: DataTypes.INTEGER,
          allowNull: false
        },
        createdAt: {
          type: DataTypes.DATE,
          allowNull: true
        },
        updatedAt: {
          type: DataTypes.DATE,
          allowNull: true
        }
      }, {
        tableName: 'course2student'
      });
    };
    
    // 定义关系
    // n----n   多对多关系
    Course.belongsToMany(User, {through: Course2Student, foreignKey: 'course_id'})
    User.belongsToMany(Course, {through: Course2Student, foreignKey: 'user_id'})
    
    // 查询
    router.get('/:username', (req, res) => {
      let username = req.params.username
      User.findOne({
        where: {
          username: username
        },
        // include: [UserInfo, Phone, School]
        // include: [
        //   {model: UserInfo, as: 'user_info'},
        //   {model: Phone, as: 'phone'},
        //   {model: School, as: 'school'},
        // ]
        include: [{all: true}]
      }).then((result) => {
        res.json(result)
      }).catch((err) => {
        res.status(500).send(err)
      });
    })
    

    相关文章

      网友评论

        本文标题:Sequelize 关联查询

        本文链接:https://www.haomeiwen.com/subject/xkixrctx.html