使用Sequelize(orm)操作 MySQL (2)

前面有篇文章我讲了一些当数据库比较简单, 数据间不存在关联时的一些基本操作, 这次我们讲讲数据关系(association)的建立以及当数据存在关联时相应的操作

Sequelize提供的三种关系

One to One association (1:1关系)

sequelize 提供了hasOne, belongsTo 两个API供我们使用, 我们先定义一下表:

// 一个用户只有一个博客
let User = Database.define("User", {
  name: Sequelize.STRING,
  code: Sequelize.NUMBER
});
let Blog = Database.define("Blog", {
  name: Sequelize.STRING,
  url: Sequelize.STRING
});

hasOnebelongsTo 具体的用法

// belongsTo
Blog.belongsTo(User); // 会在blog数据中添加外键userId
Blog.belongsTo(User, {as: "writer"}); // 会在blog数据中添加外键writerId
Blog.belongsTo(User, {foreignKey: "writer"}); // 会在blog数据中添加外键writer

// hasOne
User.hasOne(Blog); // 会在user数据中添加外键blogId
User.hasOne(Blog, {as: "myBlog"}); // 会在blog数据中添加外键myBlogId
User.hasOne(Blog, {foreignKey: "blog"}); // 会在blog数据中添加外键blog

hasOne和belongsTo的区别
上文中每句代码的作用都是一样的, 都是给BlogUser绑定一对一关系, 它们的区别在于, 使用 belongsTo 的时候会在Blog中添加外键userId , 使用hasOne 则是在User中添加外键 blogId.

as的用法
针对Blog.belongsTo(User, {as: "writer"});, 其实as就是在Blog表中将User表的表名变为writer, 之后sequelize根据驼峰命名法 命名外键: writer + id –> writerId, 如果没有设置as, 则是 User + id –> userId

One-To-Many (1:n关系)

针对这个关系, sequelize 提供了hasMany , 先添加一个文章数据表

let Article = Database.define("Article", {
  title: Sequelize.STRING,
  content: Sequelize.STRING
});

hasMany 的具体用法:

// 使用as
Blog.hasMany(Article, {as: "articles"});  // 会在article数据中添加外键blogId
Article.belongsTo(Blog);

// 使用foreignKey
Blog.hasMany(Article, {foreignKey: "blog"});  // 会在article数据中添加外键blog
Article.belongsTo(Blog, {foreignKey: "blog"});

// 同时使用as和foreignKey
Blog.hasMany(Article, {foreignKey: "blog"});  // 会在article数据中添加外键blog
Article.belongsTo(Blog, {as: "articles", foreignKey: "blog"});  //查询blog时, 可以填充articles字段

Belongs-To-Many(n:m关系)

一篇文章可能出现在多个分类中, 一个分类中可能有多篇文章, 两者间的关系需要有一个关联, 先定义分类数据表以及两者关联的文章分类表:

let Category = Database.define({
  name: Sequelize.STRING
});
let ArticleCategory = Database.define("ArticleCategory");

belongsToMany 的用法

Article.belongsToMany(Category, {through: "ArticleCategory"});
Category.belongsToMany(Article, {through: "ArticleCategory"});
// ArticleCategory表包含两个字段: articleId, categoryId

Sequelize提供的拓展方法

belongsTo 和 hasOne的拓展方法

Blog.belongsTo(User); //Sequelize会给Blog表数据扩展getUser, setUser, createUser方法
Blog.belongsTo(User, {as: "writer"}); //Sequelize会给User表数据扩展getUser, setUser, createUser方法

User.hasOne(Blog); //Sequelize会给User表数据扩展getBlog, setBlog, createBlog方法

hasMany的拓展方法

Blog.hasMany(Article);
//Sequelize会给Blog表数据扩展getArticles, setArticles, addArticle, addArticles, createArticle, removeArticle, removeArticles, hasArticle, hasArticles, countArticles方法

belongsToMany的扩展方法

和hasMany相同

后记

后面还有一些具体的操作要写, 但是由于boss新给了个比较急的任务, 检查公司业务代码中存在的内存泄漏问题, 所以后续的一些等新的任务完成之后再更新.

0%