iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Software Development

Node.js隨手札記 想到什麼就說什麼的系列 第 29

第二十九天 node.js x Sequelize x ORM 第六站

  • 分享至 

  • xImage
  •  

今天來分享如何達成 簡易關聯關係~

因為我們前面已經有生成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);

登愣我們確實透過關聯把資料打到資料庫囉~~

希望能夠幫助到大家~


上一篇
第二十八天 node.js x Sequelize x ORM 第五站
下一篇
第三十天 結束...了?
系列文
Node.js隨手札記 想到什麼就說什麼的30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言