Sequelize 的 define model
¶Sequelize 的 define model
定義 table 與 model 的映射,使用 sequelize.define()
使用了 sequelize-cli 後, model 的寫法如下
models/project.js
1 | module.exports = function(sequelize, DataTypes) { |
¶Sequelize Define 使用方式
Sequelize 將自動添加 createdAt
和 updatedAt
屬性
語法
const attributes = {} |
回傳的是可以操作資料表的 class
, 要取得資料表的實例化物件,可以用 myModel.build()
不過不是一般的用法
myModel //class |
¶attributes
直接看示範
1 | var Foo = sequelize.define('foo', { |
¶DataTypes
參考 Data types
example: 列舉
1 | sequelize.define('model', { |
¶Getter/Setter
在 sequelize.define()
裡,attributes
, config
都可以定義 getter/setter
getter/setter 有兩種。
- 可以映射成資料表欄位: protecting properties
- 可以只當作 model 的屬性: pseudo properties
pseudo properties (不真實存在 database schema 的 attribute)。
注意: 同名屬性,後定義優先覆蓋前定義
要使用 ES6 的寫法實現。
在 name 裡定義 getter, 在 title 裡定義 setter
1 | var Employee = sequelize.define('employee', { |
使用時這樣使用
1 | Employee |
¶關聯 (foreign key)
在 sequelize 的 define 階段只要宣告 hasOne
這一類的 method 即可
Foo.member.hasOne(Bar, {foreignKey: 'foo_id'}) |
¶config
時間戳記可以單獨使用 (要先開,再指定是否要使用)
- 資料表
- tableName: 自訂 table name
- 資料欄位
- underscored (false): 是否全小寫欄位名稱
- freezeTableName (true): 不改成複數型的 table name
- comment (’’): 欄位註解 (MYSQL, PG only)
- 自動生成欄位
- timestamps (true): 是否加上 updatedAt, createdAt 欄位
- createdAt: false or ‘自訂欄位名稱’
- updatedAt: false or ‘自訂欄位名稱’
- paranoid (false): 當 timestamps: true 時,是否加上 deletedAt
- deletedAt: false or ‘自訂欄位名稱’
- timestamps (true): 是否加上 updatedAt, createdAt 欄位
example:
1 | var Bar = sequelize.define('bar', { /* attributes */ }, { |
¶擴充 model 的 methods
超重要,這一個部份是大部份的重要邏輯放置的做法。
Model 之所以重要,並不是因為它可以把 table 的欄位,當作 object 的 property 而已。而是因為它可以將屬於 table 的邏輯放在 model 上,就是這個功能。
v3 文件的寫法
1 | var Bar = sequelize.define('bar', { /* attributes */ }, { |
v4 文件的寫法 (ES6)
1 | // Adding a class level method |
初始化會執行 sequelize-cli
生成的 associate
method 就是要在這裡處理。
它算是一種 class method (static function) 執行
1 | var Bar = sequelize.define('bar', { /* attributes */ }, { |
發表於
tags:
{ sequelize }