一对一关系
用户表与用户信息表
一个用户只有一张用户信息表
// 用户表
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)
});
})
注意:
- 如果在定义关系时,使用
as
,则在使用include
的时候,也需要使用as
,且变量需要相同- 如果在定义关系是,没有使用
as
,则在使用include
的时候,不能使用as
,可以将模型直接写在数组中或者只使用model
,不使用as
。- 不过怎么定义关系,都可以通过
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)
});
})
网友评论