Egg.js + Sequelize多表关联查询的攻略
在Egg.js + Sequelize开发中,我们经常需要进行多表关联查询。本攻略将详细介绍如何实现多表关联查询,并提供两个示例。
方法1:使用belongsTo和hasMany方法
我们可以使用Sequelize的belongsTo和hasMany方法来实现多表关联查询。以下是具体步骤:
- 在定义模型时,使用belongsTo和hasMany方法定义关联关系。例如,我们有两个模型User和Post,其中Post属于User,User有多个Post。我们可以在定义Post模型时belongsTo方法定义Post属于User,使用hasMany方法定义User有多个Post。以下是具体代码:
// User模型
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const User = app.model.define('user', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(30),
age: INTEGER,
created_at: DATE,
updated_at: DATE,
});
User.associate = function() {
app.model.User.hasMany(app.model.Post, { foreignKey: 'user_id' });
};
return User;
};
// Post模型
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const Post = app.model.define('post', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
title: STRING(30),
content: STRING(255),
user_id: INTEGER,
created_at: DATE,
updated_at: DATE,
});
Post.associate = function() {
app.model.Post.belongsTo(app.model.User, { foreignKey: 'user_id' });
};
return Post;
};
在这个示例中,我们定义了User和Post两个模型,并使用belongsTo和hasMany方法定义了它们之间的关联关系。
- 在查询时,使用include方法指定关联模型。例如,我们要查询所有Post及其对应的User信息,可以使用以下代码:
const posts = await ctx.model.Post.findAll({
include: [{
model: ctx.model.User,
attributes: ['name', 'age'],
}],
});
在这个示例中,我们使用findAll方法查询所有Post,并使用include方法指定关联的User模型。我们还可以使用attributes属性指定要查询的User模型的字段。
方法2:使用hasOne和belongsTo方法
我们也可以使用Sequelize的hasOne和belongsTo方法来实现多表关联查询。以下是具体步骤:
- 在定义模型时,使用hasOne和belongsTo方法定义关联关系。例如,我们有两个模型User和Profile,其中Profile属于User,User有一个Profile。我们可以在定义Profile模型时使用belongsTo方法定义Profile属于User,使用hasOne方法定义User有一个Profile。以下是具体代码:
// User模型
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const User = app.model.define('user', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(30),
age: INTEGER,
created_at: DATE,
updated_at: DATE,
});
User.associate = function() {
app.model.User.hasOne(app.model.Profile, { foreignKey: 'user_id' });
};
return User;
};
// Profile模型
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const Profile = app.model.define('profile', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
gender: STRING(10),
address: STRING(255),
user_id: INTEGER,
created_at: DATE,
updated_at: DATE,
});
Profile.associate = function() {
app.model.Profile.belongsTo(app.model.User, { foreignKey: 'user_id' });
};
return Profile;
};
在这个示例中,我们定义了User和Profile两个模型,并使用hasOne和belongsTo方法定义了它们之间的关联关系。
- 在查询时,使用include方法指定关联模型。例如,我们要查询所有User及其对应的Profile信息,可以使用以下代码:
const users = await ctx.model.User.findAll({
include: [{
model: ctx.model.Profile,
attributes: ['gender', 'address'],
}],
});
在这个示例中,我们使用findAll方法查询所有User,并使用include方法指定关联的Profile模型。我们还可以使用attributes属性指定要查询的Profile模型的字段。
结论
在Egg.js + Sequelize开发中,我们可以使用belongsTo、hasMany、hasOne和belongsTo方法来实现多表关联。使用belongsTo和hasMany方法适用于一对多的关系,使用hasOne和belongsTo方法适用于一对一的关系。在实际中,我们可以根据具体需求选择不同的方法。