在EggJS中使用Sequelize做聯表查詢
-
一對一
在controller裡面如下寫
// 獲取學生資訊 通過一對多的聯絡 async info(){ const { ctx, app } = this; let result = await app.model.Student.findAll({ include: { model: app.model.Info } }); ctx.body = result; } 複製程式碼
獲取到的值如下:
[ // 第一個學生 { "id": 1, "number": "160101", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:16:09", "updatedAt": "2019-05-12 13:16:12", "deletedAt": null, "info": {// 聯表查到的資訊 "sex": "男", "id": 1, "name": "許仙", "age": 23, "studentId": 1, "createdAt": "2019-05-12 13:25:58", "updatedAt": "2019-05-12 13:26:01", "deletedAt": null } }, // 第二個學生 { "id": 2, "number": "160201", "password": "202cb962ac59075b964b07152d234b70", "classId": 2, "createdAt": "2019-05-12 13:16:32", "updatedAt": "2019-05-12 13:16:35", "deletedAt": null, "info": { "sex": "女", "id": 2, "name": "白素貞", "age": 20, "studentId": 2, "createdAt": "2019-05-12 13:26:41", "updatedAt": "2019-05-12 13:26:46", "deletedAt": null } }, { "id": 3, "number": "160102", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:17:17", "updatedAt": "2019-05-12 13:17:21", "deletedAt": null, "info": { "sex": "男", "id": 3, "name": "法海", "age": 22, "studentId": 3, "createdAt": "2019-05-12 13:27:20", "updatedAt": "2019-05-12 13:27:22", "deletedAt": null } }, { "id": 4, "number": "160103", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:17:51", "updatedAt": "2019-05-12 13:17:54", "deletedAt": null, "info": { "sex": "女", "id": 4, "name": "小青", "age": 18, "studentId": 4, "createdAt": "2019-05-12 13:27:48", "updatedAt": "2019-05-12 13:27:51", "deletedAt": null } }, { "id": 5, "number": "160104", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:18:13", "updatedAt": "2019-05-12 13:18:16", "deletedAt": null, "info": { "sex": "女", "id": 5, "name": "金如意", "age": 20, "studentId": 5, "createdAt": "2019-05-12 13:28:34", "updatedAt": "2019-05-12 13:28:37", "deletedAt": null } }, { "id": 6, "number": "160202", "password": "202cb962ac59075b964b07152d234b70", "classId": 2, "createdAt": "2019-05-12 13:18:36", "updatedAt": "2019-05-12 13:18:39", "deletedAt": null, "info": { "sex": "男", "id": 6, "name": "景鬆", "age": 23, "studentId": 6, "createdAt": "2019-05-12 13:30:07", "updatedAt": "2019-05-12 13:30:10", "deletedAt": null } } ] 複製程式碼
-
一對多
// 獲取班級名為 軟體工程1601 的班級學生 async student(){ const { ctx, app } = this; let result = await app.model.Classes.findAll({ where: { name: '軟體工程1601' }, include: { model: app.model.Student } }) ctx.body = result; } 複製程式碼
獲取資料如下:
[ { "id": 1, "name": "軟體工程1601", "createdAt": "2019-05-12 13:11:43", "updatedAt": "2019-05-12 13:11:47", "deletedAt": null, "students": [ { "id": 1, "number": "160101", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:16:09", "updatedAt": "2019-05-12 13:16:12", "deletedAt": null }, { "id": 3, "number": "160102", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:17:17", "updatedAt": "2019-05-12 13:17:21", "deletedAt": null }, { "id": 4, "number": "160103", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:17:51", "updatedAt": "2019-05-12 13:17:54", "deletedAt": null }, { "id": 5, "number": "160104", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:18:13", "updatedAt": "2019-05-12 13:18:16", "deletedAt": null } ] } ] 複製程式碼
-
多對多
從學生獲取課程資訊
// 獲取學生的選課內容 async lession(){ const { ctx, app } = this; let result = await app.model.Student.findAll({ where:{ id: 1, }, include: [ {model: app.model.Info}, {model: app.model.Lession} ] }); ctx.body = result; } 複製程式碼
這裡的話,注意include的值為一個數組了,這樣可以多個聯表獲取資料
資料如下:
[ { "id": 1, "number": "160101", "password": "202cb962ac59075b964b07152d234b70", "classId": 1, "createdAt": "2019-05-12 13:16:09", "updatedAt": "2019-05-12 13:16:12", "deletedAt": null, "info": { "sex": "男", "id": 1, "name": "許仙", "age": 23, "studentId": 1, "createdAt": "2019-05-12 13:25:58", "updatedAt": "2019-05-12 13:26:01", "deletedAt": null }, "lessions": [ { "id": 1, "name": "計算機網路", "createdAt": "2019-05-12 13:12:32", "updatedAt": "2019-05-12 13:12:35", "deletedAt": null, "lession_student": { "lessionId": 1, "studentId": 1, "createdAt": "2019-05-12 13:20:35", "updatedAt": "2019-05-12 13:20:40", "deletedAt": null } }, { "id": 2, "name": "Java程式設計", "createdAt": "2019-05-12 13:12:50", "updatedAt": "2019-05-12 13:12:52", "deletedAt": null, "lession_student": { "lessionId": 2, "studentId": 1, "createdAt": "2019-05-12 13:23:10", "updatedAt": "2019-05-12 13:23:13", "deletedAt": null } }, { "id": 3, "name": "軟體專案管理", "createdAt": "2019-05-12 13:13:07", "updatedAt": "2019-05-12 13:13:10", "deletedAt": null, "lession_student": { "lessionId": 3, "studentId": 1, "createdAt": "2019-05-12 13:24:21", "updatedAt": "2019-05-12 13:24:24", "deletedAt": null } } ] } ] 複製程式碼
從課程獲取選課學生:
// 獲取某個課的參課學生 async lessionStudent(){ const { ctx, app } = this; let result = await app.model.Lession.findAll({ where:{ name: '網路安全' }, include: { model: app.model.Student, include: { model: app.model.Info } } }); ctx.body = result; } 複製程式碼
這裡注意,在include的下面又有一個include,第二個include是相對Student表的
資料如下:
[ { "id": 4, "name": "網路安全", "createdAt": "2019-05-12 13:13:22", "updatedAt": "2019-05-12 13:13:25", "deletedAt": null, "students": [ { "id": 2, "number": "160201", "password": "202cb962ac59075b964b07152d234b70", "classId": 2, "createdAt": "2019-05-12 13:16:32", "updatedAt": "2019-05-12 13:16:35", "deletedAt": null, "lession_student": { "lessionId": 4, "studentId": 2, "createdAt": "2019-05-12 13:24:59", "updatedAt": "2019-05-12 13:25:03", "deletedAt": null }, "info": { "sex": "女", "id": 2, "name": "白素貞", "age": 20, "studentId": 2, "createdAt": "2019-05-12 13:26:41", "updatedAt": "2019-05-12 13:26:46", "deletedAt": null } }, { "id": 6, "number": "160202", "password": "202cb962ac59075b964b07152d234b70", "classId": 2, "createdAt": "2019-05-12 13:18:36", "updatedAt": "2019-05-12 13:18:39", "deletedAt": null, "lession_student": { "lessionId": 4, "studentId": 6, "createdAt": "2019-05-12 13:25:12", "updatedAt": "2019-05-12 13:25:15", "deletedAt": null }, "info": { "sex": "男", "id": 6, "name": "景鬆", "age": 23, "studentId": 6, "createdAt": "2019-05-12 13:30:07", "updatedAt": "2019-05-12 13:30:10", "deletedAt": null } } ] } ] 複製程式碼
4. 總結
用時4小時,除錯加資料庫設定,程式碼編寫,查文件。允許我偷個懶,不想總結了,仔細閱讀內容,基本上可以瞭解Sequelize在聯表查詢上的基本用法了