Sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系。基于模型关系可以实现关联表之间的连接查询、更新、删除等操作。本文将通过一个示例,介绍模型的定义,创建模型关联关系,模型与关联关系同步数据库,及关系模型的增、删、改、查操作。
数据库中的表之间存在一定的关联关系,表之间的关系基于主/外键进行关联、创建约束等。关系表中的数据分为1对1(1:1)、1对多(1:M)、多对多(N:M)三种关联关系。
在Sequelize中建立关联关系,通过调用模型(源模型)的belongsTo、hasOne、hasMany、belongsToMany方法,再将要建立关系的模型(目标模型)做为参数传入即可。这些方法会按以下规则创建关联关系:
hasOne - 与目标模型建立1:1关联关系,关联关系(外键)存在于目标模型中。
belongsTo - 与目标模型建立1:1关联关系,关联关系(外键)存在于源模型中。
hasMany - 与目标模型建立1:N关联关系,关联关系(外键)存在于目标模型中。
belongsToMany - 与目标模型建立N:M关联关系,会通过sourceId和targetId创建交叉表。
为了能够清楚说明模型关系的定义及关系模型的使用,我们定义如下4个模型对象:
用户(User)-与其它模型存在1:1、1:N、N:M
用户登录信息(UserCheckin)-与User存在1:1关系
用户地址(UserAddress)-与User存在N:1关系
角色(Role)-与User存在N:M关系
这几个模型的E-R结构如下:
接下来上代码,代码和瓷土不符,请注意!
代码写的有点low,没办法,!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327/** * 大家就按照我的步骤来,一点一点,要有耐心哦 * 我相信,最后肯定有你想要的!加油 */ //引入框架 const Sequelize = require('sequelize'); //创建ORM实例 const sequelize = new Sequelize('sequlizedb', 'root', 'guoguo', { 'dialect': 'mysql', // 数据库使用mysql } ); //验证连接 sequelize .authenticate() .then(() => { console.log('链接成功'); }) .catch((error) => { console.log('链接失败' + error); }) //模型的创建 const User = sequelize.define('user', { name: Sequelize.STRING, age: Sequelize.INTEGER, }, { freezeTableName: true, }); // User.create({ // name: 'guo', // age: 25 // }) // .then((result) => { // console.log('=======添加成功==================='); // console.log(result); // console.log('=========================='); // }) // .catch((error) => { // console.log('=========================='); // console.log('添加失败' + error); // console.log('=========================='); // }); // const Role=sequelize.define('role',{ // name:{ // type:sequelize.STRING, // } // }, // {freezeTableName:true}); const Message = sequelize.define('message', { text: Sequelize.STRING, }, { freezeTableName: true, }); const Image = sequelize.define('image', { url: Sequelize.STRING, }, { freezeTableName: true, }); //删除表 // sequelize.drop() // .then((logging)=>{ // console.log('=========================='); // console.log('删除成功!'+logging); // console.log('=========================='); // }) // .catch((error)=>{ // console.log('=========================='); // console.log('删除失败'+error); // console.log('=========================='); // }); //建立关系 // Message.belongsTo(User); // Message.hasMany(Image); //同步到数据库 // sequelize.sync({ // force: true, // }).then(() => { // console.log('=========================='); // console.log('同步成功'); // console.log('=========================='); // }).catch(() => { // console.log('=========================='); // console.log('同步失败'); // console.log('=========================='); // }); //cudr function addUers(name, age) { User.create({ name: name, age: age, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('增加用户成功' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('增加用户失败' + error); console.log('=========================='); }); } function addMessage(userId, text) { Message.create({ text: text, userId: userId, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('增加成功!' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('增加失败!' + error); console.log('=========================='); }); } function addImage(messageId, imageUrl) { Image.create({ url: imageUrl, messageId: messageId, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('添加图片成功' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('添加图片失败' + error); console.log('=========================='); }); } //测试 //addUers('杨雪娇',22); //addMessage(2, '杨雪娇发来的消息3'); // addImage(5,'http://3.png'); // addImage(6,'http://4.png'); // addImage(2,'http://2.png'); // // function getAllMessage() { Message.findAll({ where: { userId: 2 }, include: [ { model: User, attributes: [ 'id', 'name', ], }, { model: Image, attributes: [ 'id', 'url' ] } ], }).then((result) => { result = JSON.stringify(result); console.log('=========================='); console.log(result); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('查询失败' + error); console.log('=========================='); }); } //测试 //getAllMessage(); //删除消息 function delMessage(userId, messageId) { Message.destroy({ where: { userId: userId, id: messageId, }, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('删除消息成功!' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('删除消息失败!' + error); console.log('=========================='); }); } //测试 //测试发现问题 如果不设置级联 则,从属message表的image表记录不会删除,而只是出现对应messageId 为NULL的现象 //delMessage(2,4); const Role = sequelize.define('role', { name: { type: Sequelize.STRING, allowNull: true, } }, { freezeTableName: true, }); //对于单个模型的同步 // Role.sync().then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('Role表数据同步成功' + log); // console.log('=========================='); // Role.create({ // name: '管理员' // }).then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('添加的数据为' + log); // console.log('=========================='); // }).catch((error) => { // console.log('=========================='); // console.log('添加数据失败' + error); // console.log('=========================='); // }); // }).catch((error) => { // console.log('=========================='); // console.log('Role模型与表数据同步失败' + error); // console.log('=========================='); // }); //定义User1模型 const User1 = sequelize.define('user1', { name: { type: Sequelize.STRING, validate: { notEmpty: true, len: [2, 30], } }, age: { type: Sequelize.STRING, defaultValue: 21, validate: { isInt: { msg: '年龄必须是整数!', } } }, email: { type: Sequelize.STRING, validate: { isEmail: true, } }, userpicture: Sequelize.STRING, }, { freezeTableName: true, }); // //同步User1模型 // User1.sync().then((log) => { // log = JSON.stringify(log); // console.log('=========================='); // console.log('User1表数据同步成功' + log); // console.log('=========================='); // }).catch((error) => { // console.log('=========================='); // console.log('User1模型与表数据同步失败' + error); // console.log('=========================='); // }); function addUser1(userInfo) { User1.create({ name: userInfo.name, age:userInfo.age, email:userInfo.email, }).then((log) => { log = JSON.stringify(log); console.log('=========================='); console.log('添加的数据为' + log); console.log('=========================='); }).catch((error) => { console.log('=========================='); console.log('添加数据失败' + error); console.log('=========================='); }); } const userInfo={ name:'郭东生', //age:0.1,//Validation error: 年龄必须是整数! age:22, email:'7758@qq.com', //email:'7758',//Validation error: Validation isEmail on email failed } addUser1(userInfo);
以上这篇浅谈Node.js ORM框架Sequlize之表间关系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
最后
以上就是怕孤单悟空最近收集整理的关于浅谈Node.js ORM框架Sequlize之表间关系的全部内容,更多相关浅谈Node.js内容请搜索靠谱客的其他文章。
发表评论 取消回复