sequelize,hasOne,belongsTo 一对一关联笔记
定义表、表关联
新建用户表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 表中多了一个字段userId
,userId
是源的外键 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如果此文摘取了你的原创,请联系本站管理员,将对此文修改、删除处理。