摘要:看似一對一其實一對多這里的指的應該是查詢數據主表結果中關聯信息是以單個形式作為一個屬性掛在主表每一個對象中實際上是主表與關聯表的多對一關系拿中的和中的進行關聯配置的別名配置中的外鍵字段名稱,默認為配置中的目標鍵字段名稱,默認為主鍵查
One-To-One
看似一對一,其實一對多.這里的 One-To-One 指的應該是查詢數據(主表)結果中,關聯信息是以單個形式作為一個屬性掛在主表每一個對象中
實際上是,主表與關聯表的多對一關系.
belongsToSourceModel.belongsTo(TargetModel, { as, foreignKey, targetKey })
拿 SourceModel 中的 foreignKey 和 TargetModel 中的 targetKey 進行關聯.
as 配置 TargetModel 的別名
foreignKey 配置 SourceModel 中的外鍵字段名稱,默認為 ${as || TargetModel.name}+${TargetModel.primaryKey}
targetKey 配置 TargetModel 中的目標鍵字段名稱,默認為 TargetModel 主鍵
查詢出來結果結構如:
const sourceObj = {: , : , ... : targetObj }
SourceModel 中存在 foreignKey 關聯 TargetModel,比如:
Player.belongsTo(Team)
foreignKey 用來自定義 SourceModel 中的外鍵名稱.比如:
User.belongsTo(Company, { foreignKey: "cid" }) // User.cid 即外鍵
默認情況下,foreignKey 值為${Team.name}+${Team.primaryKey}.注意這里的連接是根據 source model 的配置而決定是 camelCase 還是 underscored.例如:
const User = this.sequelize.define("user", {}, { underscored: true }) const Company = this.sequelize.define("company", { uuid: { type: Sequelize.UUID, primaryKey: true } }) User.belongsTo(Company) // User 的 foreignKey 為 company_uuid
targetKey 用來指定 targetModel 中用來和 sourceModel 中外鍵進行匹配的字段名稱,默認為 targetModel 中的 primaryKey.比如:
User.belongsTo(Company, { foreignKey: "cid", targetKey: "uuid" }) // 即將 User.cid 與 Company.uuid 進行關聯
as 用來轉換 targetModel 的 name. 這里有兩個方面,一個是在生成 foreignKey 時替換 targetModel name,一個是在拼裝查詢結果時,改變 targetModel 作為 sourceModel 中的屬性的名稱.比如:
User.belongsTo(Company, { as: "com" }) // foreign key would be: com_uuid // company property of user object would be "com"hasOne
SourceModel.hasOne(TargetModel, { as, foreignKey })
拿 SourceModel 中的主鍵和 TargetModel 中的外鍵進行關聯
as 配置 TargetModel 的別名
foreignKey 配置 TargetModel 中的外鍵字段名稱,默認為 ${as || SourceModel.name}+${SourceModel.primaryKey}
查詢結構為:
const sourceObj = {: , : , ... : targetObj }
TargetModel 中存在 foreignKey 關聯 SourceModel,比如:
Company.hasOne(User)
foreignKey 默認為 ${Company.name}+${Company.primaryKey}.也可以自定義:
Company.hasOne(User, { foreignKey: "company_id" }) // User.company_id 為外鍵
targetKey hasOne 中沒有 targetKey 屬性
belongsTo V.S hasOne如果關聯信息(比如:外鍵)保存在 source 中,就是用belongsTo;如果關聯信息保存在 target 中,則是用hasOne
比如:
Player 表,teamId 關聯 Team 表
Coach 表
Team 表,coachId 關聯 Coach 表
Player.belongsTo(Team) // Player.teamId -- Team.id Coach.hasOne(Team) // Team.coachId -- Coach.id
為什么不能反過來,比如Player.belongsTo(Team)中將 source 和 target 交換下,不就可以應用hasOne了嗎?問題就在于 source 是根據查詢要求而定的,如果是要查詢 Player,并把關聯的 Team 信息帶出來,那么 source 就只能是 Player.
小結:根據查詢主表,即 source,找到需要查詢到的關聯表,如果關聯信息(外鍵)在 source 中,則 belongsTo,否則 hasOne.
One-To-Many hasManySourceModel.hasMany(TargetModel, { as, foreignKey, sourceKey })
拿 TargetModel 中的外鍵與 SourceModal 中的主鍵關聯
as 配置 TargetModel 別名
foreignKey 配置 TargetModel 中外鍵名稱,默認為 ${SourceModel.name}+${SourceMode.primaryKey}
soruceKey 配置 SourceModel 中關聯鍵名稱,默認為 SourceModel.primaryKey
這里 as 的值并不影響 key 的默認值
Many-To-Many belongsToManySourceModel.belongsToMany(TargetModel, { through: AssociationModel, as, foreignKey, otherKey })
通過中間表進行關聯
as 中間表 AssociationModel 的別名
foreignKey 配置 AssociationModel 中與 SourceModel 主鍵關聯的外鍵名稱,默認為 SourceModel.name + SourceModel.primaryKey
otherKey 配置 AssociationModel 中與 TargetModel 主鍵關聯的外鍵名稱,默認為 TargetModel.name + TargetModel.primaryKey
這里 as 的值并不影響 key 的默認值
User.belongsToMany(Role, { through: RoleAssignment, foreignKey: "userId", otherKey: "roleId" }) user.findAll({ include: [{ model: Role, through: { // attributes: [], // uncomment this line to hide RoleAssignment as attribute in result in target model model: RoleAssignment, where } }] })
返回結果
const result = [{ id: "", userName: "", gender: "", roles: [{ id: "", roleName: "", ... RoleAssignment: { id: "", roleId: "", userId: "", ... } }] }]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104016.html
摘要:使用來操作數據庫,但是項目進行到后期肯定會有字段的新增一般都有操作。在程序運行時調用,把跟數據表同步。而需要你手動定義數據庫遷移。定義遷移升級,定義回滾,回滾一般用不到。文檔模型新增字段會自動在數據庫中添加 使用sequelize來操作數據庫,但是項目進行到后期肯定會有字段的新增. 1.ORM一般都有sync操作。在程序運行時調用,把model跟數據表同步。 而sequelize需要你...
摘要:今天開源了一個百度云網盤爬蟲項目,地址是。推薦使用命令安裝依賴,最簡單的安裝方式更多安裝的命令可以去上面找。啟動項目使用進行進程管理,運行啟動所有的后臺任務,檢查任務是否正常運行可以用命令,正常運行的應該有個任務。 今天開源了一個百度云網盤爬蟲項目,地址是https://github.com/callmelanmao/yunshare。 百度云分享爬蟲項目 github上有好幾個這樣的...
閱讀 1669·2021-11-16 11:41
閱讀 2462·2021-11-08 13:14
閱讀 3113·2019-08-29 17:16
閱讀 3082·2019-08-29 16:30
閱讀 1849·2019-08-29 13:51
閱讀 362·2019-08-23 18:38
閱讀 3231·2019-08-23 17:14
閱讀 635·2019-08-23 15:09