sequelize,hasOne,belongsTo 一对一关联笔记

文章发布于2020年10月19日 14:57, 归类于: Node.js

《Associations - 关联》https://github.com/demopark/sequelize-docs-Zh-CN/blob/master/core-concepts/assocs.md

定义表、表关联

新建用户表users。

const { DataTypes } = require("sequelize");
module.exports = sequelize => {
  const modelName = sequelize.define("users", {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    name: {
      type: DataTypes.STRING
    }
  }, {
    freezeTableName: true,
    charset: 'utf8',
    collate: 'utf8_general_ci'
  });

  return modelName
}

自行车表bikes。

const { DataTypes } = require("sequelize");
module.exports = sequelize => {
  const modelName = sequelize.define("bikes", {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    color: {
      type: DataTypes.STRING
    }
  }, {
    freezeTableName: true,
    charset: 'utf8',
    collate: 'utf8_general_ci'
  });

  return modelName
}

将 users 模型和 bikes 模型关联。

const sequelize = require('../database').sequelize();
let UserModel = require('./UserModel')(sequelize)
let BikeModel = require('./BikeModel')(sequelize)

UserModel.hasOne(BikeModel)
BikeModel.belongsTo(UserModel)

// 首次执行完请注释此行代码,测试时可以用这行代码重置表。
// sequelize.sync({ force: true });

module.exports = {
  UserModel,
  BikeModel
}

source 和 targe 基本概念

source(“源”)和targe(“目标”)模型。

UserModel.hasOne(BikeModel)
BikeModel.belongsTo(UserModel)

运行了上面的代码进行表关联,bikes 表中多了一个字段userIduserId是源的外键 id。

我区分源和目标的方法是谁发送了参数,谁接受了参数,从源传入参数到目标,users将自己的外键id传到了bikes中,users是source(“源”),bikes是targe(“目标”)。

创建新用户和自行车

自行车手动绑定 userId。

var user = await UserModel.create({name:'小明'});
var bike = await BikeModel.create({ color: '蓝色',userId:user.id});

查看数据库,如果新创建的用户 id 是7,那么新创建的自行车userId也为7。

create 和 setter 和 getter

UserModel.hasOne(BikeModel)

源模型使用hasOne后,获得 create、 setter 和 getter 方法。

上面的代码执行后 user 获得 createBike、setBike 和 getBike 方法。

create

用户使用 createBike 创建自行车。

user = await UserModel.create({name:'小江'});
bike = await user.createBike({ color: '青色'});

setter

用户使用 setter 方法关联自行车。

user = await UserModel.create({name:'小鱼'});
bike = await BikeModel.create({ color: '紫色'});
await user.setBike(bike)

查看数据库,如果新创建的用户id是8,那么新创建的自行车userId也为8。

getter

// 通过 id 查询用户
var user = await UserModel.findByPk(8);
// 获取用户的自行车
var bike = await user.getBike()

删除用户

删除关联时,外键会同步。

删除 id 为 7 的用户。

var user = await UserModel.destroy({
  where:{
    id:7
  }
});

查看数据库自行车表,刚才userId为 7 的自行车的userId变成了null。

定义外键名称

UserModel.hasOne(BikeModel)
BikeModel.belongsTo(UserModel)

默认的外键名称是源模型表名+'Id',上面关联的外键名称为userId

BikeModel.belongsTo(UserModel,{foreignKey: 'guyId'});

现在,外键名称为guyId

除了通过foreignKey修改外键名称,还可以通过修改关联原型的别名来修改外键名称。

定义别名

定义别名后,操作时必须传定义的别名,否则报错。

BikeModel.belongsTo(UserModel,{as: 'boos'});

现在,外键名称为boosId

// 通过将模型传递给 include 不能再触发预先加载:

console.log((await BikeModel.findAll({ include: UserModel })).toJSON()); // 引发错误

相反,你必须传递别名:

console.log((await BikeModel.findAll({ include: 'boos' })).toJSON());

强制性与可选性关联

上面的自行车不需要关联userId也可以创建。

如果想强制关联userId,可以在关联时设置allowNull: false

const { DataTypes } = require("sequelize");

UserModel.hasOne(BikeModel,{
  foreignKey:{
    allowNull: false, // allowNull 默认true。true:允许为空。false:不允许为空。
    // name: 'guyId'
    // type: DataTypes.UUID
  }
})

也可以在定义表时设置userId不允许为空。

转载请注明来源:《 sequelize,hasOne,belongsTo 一对一关联笔记》- rojerYong's Blog

文章链接:https://www.eoway.cn/article/1603090627.html

如果此文摘取了你的原创,请联系本站管理员,将对此文修改、删除处理。

--END--
上一篇:sequelize,hasMany,belongsTo 一对多关联笔记 下一篇:阿里云oss绑定二级域名添加ssl证书