02-blog-model构建及关系

129 阅读2分钟

本节建立model层的表格:

分别有user用户表格,article文章表格,comment评论表格,tag标签表格

以user.js为例:

const {DataTypes} = require("sequelize") //引入数据类型约束
const sequelize = require("../db/sequelize")

const User = sequelize.define("User",{
    email:{
        type:DataTypes.STRING,
        allowNull:false,//允许为空?
        primaryKey:true //主键
    },
    username:{
        type:DataTypes.STRING,
        allowNull:false,
        unique:true //唯一
    },
    password:{
        type:DataTypes.STRING,
        allowNull:false
    },
    avatar:{
        //头像
        type:DataTypes.TEXT,
        allowNull:true
    },
    bio:{//简介
        type:DataTypes.TEXT,
        allowNull:true
    }
})
module.exports=User

接下来的几个表格都这样建就可以。建完之后都引入到initDB中来构建数据库中每个表之间的关联关系,一对一,一对多,多对一,多对多。

A.hasOne(B) A有一个B
A.belongsTo(B) A属于B
A.hasMany(B) A有多个B(可以有一个onDelete标识,用于删除A之后也要删除A产生的BA.belongsToMany(B,{throuh:"C"}) A属于多个B,通过连接表C,所以表C是新产生的表

用户,文章,评论,标签这四者的关系:

一个用户有多篇文章,hasmany

一篇文章只能属于一个用户,belongsto

一个用户能去评论很多,hasmany

一个评论只属于一个作者,Belongsto

一个用户能关注多个用户,多对多,belongstomany

一篇文章可以有很多评论,hasmany

一个评论只能属于一篇文章,belongsto

一个文章能有多个标签,hasmany

一个标签也能给多个文章使用,hasmany

......

const initRelation = ()=>{
    User.hasMany(Artical,{
        onDelete:"CASCADE"//小瀑布,用于删除作者,同时删除他的所有文章
    });
    Artical.belongsTo(User)

    Artical.belongsToMany(Tag,{
        through:"TagList", //多对多产生的新表
        uniqueKey:false, //唯一的键?无
        timestamps:false //无时间戳
    });
    Tag.belongsToMany(Artical,{
        through:"TagList",
        uniqueKey:false,
        timestamps:false
    });

    Artical.hasMany(Comment,{
        onDelete:"CASCADE" //小瀑布
    });
    Comment.belongsTo(Artical);

    User.hasMany(Comment,{
        onDelete:"CASCADE"
    })
    Comment.belongsTo(User)

    User.belongsToMany(User,{
        through:"Followers",
        as:"followors",//因为User对User,不加as会报错
        timestamps:false
    })

    User.belongsToMany(Artical,{
        through:"Favourites",
        timestamps:false
    })
    Artical.belongsToMany(User,{
        through:"Favourites",
        timestamps:false
    })

}

写好之后去调用这个方法,并且设置自动同步该模型:

await sequelize.sync({alter:true}) //自动同步

完成之后,至此已经完成数据库建表的方法,可以打开软件刷新并查看一下是否建表成功,是否产生了关联表。

image.png

有的!完成model的构建以及关系