今天來分享如何達成 簡易關聯關係~
因為我們前面已經有生成User表了
我們再來生成一份article(文章)表吧
npx sequelize-cli model:generate --name article --attributes 'title:string,content:text'
在執行
npx sequelize-cli db:migrate
這樣我們就也生成 article 表單了
User 與 article 是一對多的關係
一對多口語化就是
一個使用者可以擁有很多篇文章
而文章都屬於同一個使用者
可以透過這種口語化的解說來思考兩張表之間的關聯
在ORM的世界裡面要達成關聯很快速,也非常口語化
我們直接開始吧~
但我們忘記在article表單上增加userId了,怎麼辦~
沒關係 ORM依舊能做到新增欄位這件事
npx sequelize-cli migration:generate --name add-userId-to-articles
接著在新增加的表單裡面直接上code
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.addColumn('articles', 'userId', {
allowNull: false,
type: Sequelize.INTEGER,
});
},
async down (queryInterface, Sequelize) {
await queryInterface.removeColumn('articles', 'userId');
}
};
然後再跑一次
npx sequelize-cli db:migrate
就可以看到欄位被新增到Article裡面了哦
有些人會看到在fk鍵上 會需要設定關聯表單,但我個人比較不喜歡把這些值綁定在Sql上,我認為透過程式碼來達到關聯效果是比較直觀的
ok,欄位也有了再來我們移動到Model裏面開新增關聯方法~
其實滿貼心的,當初生成檔案的時候就有跟你說要加在哪裡了
static associate(models) {
// define association here
}
user.js
static associate(models) {
this.hasMany(models.Article, { foreignKey: 'userId' });
}
article.js
static associate(models) {
this.belongsTo(models.User, { foreignKey: "userId" });
}
Controller
const { User } = require("../models");
const { Article } = require("../models");
async function userCreateArticle(req, res) {
try {
const userId = 28; // 為了方便作業 直接hard code 一筆你擁有的user id
const getReqTitle = req.body.title;//收request
const getReqContent = req.body.content;//收request
const getUser = await User.findByPk(userId); //取得使用者資料
if (!getUser) {//如果你把userId 改成一個不存在的使用者會得到這個response
return res.status(404).json({ message: "用户不存在" });
}
const article = await getUser.createArticle({ //User創建一筆文章
title: getReqTitle,
content: getReqContent,
});
return res.status(201).json(article);
} catch (error) {
console.error("錯誤:", error);
return res.status(500).json({ message: "無法創建文章" });
}
}
這邊相當有趣,當你有創造好關聯的時候可以使用特別的方法
像我user跟article有關聯,我就可以使用相當口語化的method
createArticle,在程式碼的整體品質上也會更加分
使用方法
官方文件
進去之後搜尋關鍵字
Special methods/mixins added to instances
接著我們嘗試去打API
app.post("/api/createArticle", dataController.userCreateArticle);
登愣我們確實透過關聯把資料打到資料庫囉~~
希望能夠幫助到大家~