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

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

代码模板

'use strict';
let co = require("co");
let _ = require("underscore");
let Sequelize = require("sequelize");

let Database = new Sequelize(
    'test',                  // 要连接的数据库
    'username',              // 数据库用户名
    'password',              // 密码
    {
        'dialect': 'mysql',  // 数据库使用mysql
        'host': 'localhost', // 数据库服务器ip
        'port': 3306,        // 数据库运行端口
        'timestamp': true    // 这个参数为true是MySQL会自动给每条数据添加createdAt和updateAt字段
    }
);

/*数据表定义代码放这里*/

co(function*() {
    /*增删改查等操作放此处*/
}).catch(function (error) {
    console.log(error);
});

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值