eggjssequelize多表关联查询

  • Post category:other

Egg.js + Sequelize多表关联查询的攻略

在Egg.js + Sequelize开发中,我们经常需要进行多表关联查询。本攻略将详细介绍如何实现多表关联查询,并提供两个示例。

方法1:使用belongsTo和hasMany方法

我们可以使用Sequelize的belongsTo和hasMany方法来实现多表关联查询。以下是具体步骤:

  1. 在定义模型时,使用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方法定义了它们之间的关联关系。

  1. 在查询时,使用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方法来实现多表关联查询。以下是具体步骤:

  1. 在定义模型时,使用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方法定义了它们之间的关联关系。

  1. 在查询时,使用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方法适用于一对一的关系。在实际中,我们可以根据具体需求选择不同的方法。