前面有篇文章我讲了一些当数据库比较简单, 数据间不存在关联时的一些基本操作, 这次我们讲讲数据关系(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
});
hasOne 和 belongsTo 具体的用法
// 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的区别
上文中每句代码的作用都是一样的, 都是给Blog和User绑定一对一关系, 它们的区别在于, 使用 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新给了个比较急的任务, 检查公司业务代码中存在的内存泄漏问题, 所以后续的一些等新的任务完成之后再更新.