成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Sequelizejs 關(guān)聯(lián)

Thanatos / 3235人閱讀

摘要:看似一對(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)系.

belongsTo
SourceModel.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 hasMany
SourceModel.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 belongsToMany
SourceModel.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

相關(guān)文章

  • sequelize新增字段

    摘要:使用來(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需要你...

    raledong 評(píng)論0 收藏0
  • 實(shí)用的開源百度云分享爬蟲項(xiàng)目yunshare - 安裝篇

    摘要:今天開源了一個(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è)這樣的...

    lei___ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Thanatos

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<