sequelize 管理查询——一对一关联查询

sequelize 提供了两种一对一关系关联方法 belongsTo 和 hasOne

拿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 如下

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 如下

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的主键

Sequelize 是一个 Node.js ORM(Object-Relational Mapping) 框架,可以方便地进行数据库操作。在 Sequelize 中,关联查询可以通过定义模型之间的关系来实现。下面是一个示例: 假设我们有两个模型:用户(User)和订单(Order),用户和订单之间是一对多的关系,即一个用户可以有多个订单。我们可以通过以下方式定义它们之间的关系: ```javascript // User 模型 const User = sequelize.define('user', { name: DataTypes.STRING, age: DataTypes.INTEGER, }); // Order 模型 const Order = sequelize.define('order', { amount: DataTypes.FLOAT, }); // 关联关系 User.hasMany(Order); Order.belongsTo(User); ``` 上述代码中,我们通过 `hasMany` 和 `belongsTo` 方法来定义用户和订单之间的关系。 接下来,我们可以使用 `include` 方法来进行关联查询: ```javascript User.findOne({ where: { id: 1 }, include: Order, }).then(user => { console.log(user.orders); // 打印该用户的所有订单 }); ``` 上述代码中,我们使用 `findOne` 方法查询 id 为 1 的用户,并通过 `include` 方法将该用户的所有订单一起查询出来。在查询结果中,用户对象上会有一个 `orders` 属性,该属性对应该用户的所有订单。 如果我们想在查询结果中包含订单的详细信息,可以进一步嵌套 `include` 方法: ```javascript User.findOne({ where: { id: 1 }, include: { model: Order, include: [Product], }, }).then(user => { console.log(user.orders[0].product); // 打印该用户的第一个订单的商品信息 }); ``` 上述代码中,我们通过嵌套 `include` 方法将订单和商品关联起来。在查询结果中,订单对象上会有一个 `product` 属性,该属性对应该订单所对应的商品信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值