摘要:看似一對(duì)一其實(shí)一對(duì)多這里的指的應(yīng)該是查詢數(shù)據(jù)主表結(jié)果中關(guān)聯(lián)信息是以單個(gè)形式作為一個(gè)屬性掛在主表每一個(gè)對(duì)象中實(shí)際上是主表與關(guān)聯(lián)表的多對(duì)一關(guān)系拿中的和中的進(jìn)行關(guān)聯(lián)配置的別名配置中的外鍵字段名稱,默認(rèn)為配置中的目標(biāo)鍵字段名稱,默認(rèn)為主鍵查
One-To-One
看似一對(duì)一,其實(shí)一對(duì)多.這里的 One-To-One 指的應(yīng)該是查詢數(shù)據(jù)(主表)結(jié)果中,關(guān)聯(lián)信息是以單個(gè)形式作為一個(gè)屬性掛在主表每一個(gè)對(duì)象中
實(shí)際上是,主表與關(guān)聯(lián)表的多對(duì)一關(guān)系.
belongsToSourceModel.belongsTo(TargetModel, { as, foreignKey, targetKey })
拿 SourceModel 中的 foreignKey 和 TargetModel 中的 targetKey 進(jìn)行關(guān)聯(lián).
as 配置 TargetModel 的別名
foreignKey 配置 SourceModel 中的外鍵字段名稱,默認(rèn)為 ${as || TargetModel.name}+${TargetModel.primaryKey}
targetKey 配置 TargetModel 中的目標(biāo)鍵字段名稱,默認(rèn)為 TargetModel 主鍵
查詢出來(lái)結(jié)果結(jié)構(gòu)如:
const sourceObj = {: , : , ... : targetObj }
SourceModel 中存在 foreignKey 關(guān)聯(lián) TargetModel,比如:
Player.belongsTo(Team)
foreignKey 用來(lái)自定義 SourceModel 中的外鍵名稱.比如:
User.belongsTo(Company, { foreignKey: "cid" }) // User.cid 即外鍵
默認(rèn)情況下,foreignKey 值為${Team.name}+${Team.primaryKey}.注意這里的連接是根據(jù) 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 用來(lái)指定 targetModel 中用來(lái)和 sourceModel 中外鍵進(jìn)行匹配的字段名稱,默認(rèn)為 targetModel 中的 primaryKey.比如:
User.belongsTo(Company, { foreignKey: "cid", targetKey: "uuid" }) // 即將 User.cid 與 Company.uuid 進(jìn)行關(guān)聯(lián)
as 用來(lái)轉(zhuǎn)換 targetModel 的 name. 這里有兩個(gè)方面,一個(gè)是在生成 foreignKey 時(shí)替換 targetModel name,一個(gè)是在拼裝查詢結(jié)果時(shí),改變 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 中的外鍵進(jìn)行關(guān)聯(lián)
as 配置 TargetModel 的別名
foreignKey 配置 TargetModel 中的外鍵字段名稱,默認(rèn)為 ${as || SourceModel.name}+${SourceModel.primaryKey}
查詢結(jié)構(gòu)為:
const sourceObj = {: , : , ... : targetObj }
TargetModel 中存在 foreignKey 關(guān)聯(lián) SourceModel,比如:
Company.hasOne(User)
foreignKey 默認(rèn)為 ${Company.name}+${Company.primaryKey}.也可以自定義:
Company.hasOne(User, { foreignKey: "company_id" }) // User.company_id 為外鍵
targetKey hasOne 中沒(méi)有 targetKey 屬性
belongsTo V.S hasOne如果關(guān)聯(lián)信息(比如:外鍵)保存在 source 中,就是用belongsTo;如果關(guān)聯(lián)信息保存在 target 中,則是用hasOne
比如:
Player 表,teamId 關(guān)聯(lián) Team 表
Coach 表
Team 表,coachId 關(guān)聯(lián) Coach 表
Player.belongsTo(Team) // Player.teamId -- Team.id Coach.hasOne(Team) // Team.coachId -- Coach.id
為什么不能反過(guò)來(lái),比如Player.belongsTo(Team)中將 source 和 target 交換下,不就可以應(yīng)用hasOne了嗎?問(wèn)題就在于 source 是根據(jù)查詢要求而定的,如果是要查詢 Player,并把關(guān)聯(lián)的 Team 信息帶出來(lái),那么 source 就只能是 Player.
小結(jié):根據(jù)查詢主表,即 source,找到需要查詢到的關(guān)聯(lián)表,如果關(guān)聯(lián)信息(外鍵)在 source 中,則 belongsTo,否則 hasOne.
One-To-Many hasManySourceModel.hasMany(TargetModel, { as, foreignKey, sourceKey })
拿 TargetModel 中的外鍵與 SourceModal 中的主鍵關(guān)聯(lián)
as 配置 TargetModel 別名
foreignKey 配置 TargetModel 中外鍵名稱,默認(rèn)為 ${SourceModel.name}+${SourceMode.primaryKey}
soruceKey 配置 SourceModel 中關(guān)聯(lián)鍵名稱,默認(rèn)為 SourceModel.primaryKey
這里 as 的值并不影響 key 的默認(rèn)值
Many-To-Many belongsToManySourceModel.belongsToMany(TargetModel, { through: AssociationModel, as, foreignKey, otherKey })
通過(guò)中間表進(jìn)行關(guān)聯(lián)
as 中間表 AssociationModel 的別名
foreignKey 配置 AssociationModel 中與 SourceModel 主鍵關(guān)聯(lián)的外鍵名稱,默認(rèn)為 SourceModel.name + SourceModel.primaryKey
otherKey 配置 AssociationModel 中與 TargetModel 主鍵關(guān)聯(lián)的外鍵名稱,默認(rèn)為 TargetModel.name + TargetModel.primaryKey
這里 as 的值并不影響 key 的默認(rèn)值
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 } }] })
返回結(jié)果
const result = [{ id: "", userName: "", gender: "", roles: [{ id: "", roleName: "", ... RoleAssignment: { id: "", roleId: "", userId: "", ... } }] }]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104016.html
摘要:使用來(lái)操作數(shù)據(jù)庫(kù),但是項(xiàng)目進(jìn)行到后期肯定會(huì)有字段的新增一般都有操作。在程序運(yùn)行時(shí)調(diào)用,把跟數(shù)據(jù)表同步。而需要你手動(dòng)定義數(shù)據(jù)庫(kù)遷移。定義遷移升級(jí),定義回滾,回滾一般用不到。文檔模型新增字段會(huì)自動(dòng)在數(shù)據(jù)庫(kù)中添加 使用sequelize來(lái)操作數(shù)據(jù)庫(kù),但是項(xiàng)目進(jìn)行到后期肯定會(huì)有字段的新增. 1.ORM一般都有sync操作。在程序運(yùn)行時(shí)調(diào)用,把model跟數(shù)據(jù)表同步。 而sequelize需要你...
摘要:今天開源了一個(gè)百度云網(wǎng)盤爬蟲項(xiàng)目,地址是。推薦使用命令安裝依賴,最簡(jiǎn)單的安裝方式更多安裝的命令可以去上面找。啟動(dòng)項(xiàng)目使用進(jìn)行進(jìn)程管理,運(yùn)行啟動(dòng)所有的后臺(tái)任務(wù),檢查任務(wù)是否正常運(yùn)行可以用命令,正常運(yùn)行的應(yīng)該有個(gè)任務(wù)。 今天開源了一個(gè)百度云網(wǎng)盤爬蟲項(xiàng)目,地址是https://github.com/callmelanmao/yunshare。 百度云分享爬蟲項(xiàng)目 github上有好幾個(gè)這樣的...
閱讀 1679·2021-11-16 11:41
閱讀 2468·2021-11-08 13:14
閱讀 3119·2019-08-29 17:16
閱讀 3088·2019-08-29 16:30
閱讀 1851·2019-08-29 13:51
閱讀 366·2019-08-23 18:38
閱讀 3236·2019-08-23 17:14
閱讀 639·2019-08-23 15:09