zoukankan      html  css  js  c++  java
  • Sequelize 关系模型简介

    Sequelize 关系模型简介

    先介绍一下本文用到的术语:
    : 调用 sequelize 中关系方法的调用者
    目标: 调用 sequelize 中关系方法中的参数
    比如, User.hasOne(Project), 其中 User 是源, Project 是目标.

    一对一关系

    一对一关系通过单个外键连接两个模型.

    BelongsTo

    belongsTo 方法添加一对一关系外键到源模型上.

    var Player = this.sequelize.define('player', {/* attributes */})
      , Team  = this.sequelize.define('team', {/* attributes */});
    
    // 添加 teamId foreign key 到 Player
    Player.belongsTo(Team); 
    

    Sequelize 自动添加目标名+目标主键作为源的外键, 并且以 camelCase 表示外键名

    var User = this.sequelize.define('user', {/* attributes */})
      , Company  = this.sequelize.define('company', {/* attributes */});
    
    User.belongsTo(Company); // Will add companyId to user
    
    // 可以通过指定主键和配置参数来修改生成的外键名
    var User = this.sequelize.define('user', {/* attributes */}, {underscored: true})
      , Company  = this.sequelize.define('company', {
        uuid: {
          type: Sequelize.UUID,
          primaryKey: true
        }
      });
    
    User.belongsTo(Company); // Will add company_uuid to user
    
    // 也可以在定义关系时直接指定外键名
    var User = this.sequelize.define('user', {/* attributes */})
      , Company  = this.sequelize.define('company', {/* attributes */});
    
    User.belongsTo(Company, {foreignKey: 'fk_company'}); // Adds fk_company to User
    
    // 也可以指定目标的键作为源的外键
    var User = this.sequelize.define('user', {/* attributes */})
      , Company  = this.sequelize.define('company', {/* attributes */});
    
    User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); // Adds fk_companyname to User
    

    HasOne

    hasOne 方法添加一对一关系外键到目标模型上.

    var User = sequelize.define('user', {/* ... */})
    var Project = sequelize.define('project', {/* ... */})
     
    // 一对一关系
    Project.hasOne(User)
    
    /*
        下例中 hasOne 会添加 projectId 到 User 模型中.
        同时, Project.prototype 会添加 getUser 和 setUser 方法
    */
     
    Project.hasOne(User, { foreignKey: 'initiator_id' })
     
    /*
        通过 as 可以修改 getter 和 setter 的名字,
        下例中, Project.prototype 会添加 getInitiator 和 setInitiator 方法,
        而不是 getUser 和 setUser.
    */
     
    Project.hasOne(User, { as: 'Initiator' })
     
    // 这样就能定义自引用
    var Person = sequelize.define('person', { /* ... */})
     
    Person.hasOne(Person, {as: 'Father'})
    // 添加 FatherId 到 Person
     
    // 也可以:
    Person.hasOne(Person, {as: 'Father', foreignKey: 'DadId'})
    // 添加 DadId 到 Person
     
    // 两种情况都可以调用 getFather 和 setFather
     
    // If you need to join a table twice you can double join the same table
    Team.hasOne(Game, {as: 'HomeTeam', foreignKey : 'homeTeamId'});
    Team.hasOne(Game, {as: 'AwayTeam', foreignKey : 'awayTeamId'});
    
    Game.belongsTo(Team);
    

    一对多关系

    一对多关系连接一个源到多个目标.

    var User = sequelize.define('user', {/* ... */})
    var Project = sequelize.define('project', {/* ... */})
    
    // 定义一(Project)对多(User)关系, 
    Project.hasMany(User, {as: 'Workers'})
    // 添加 projectId 到 User,
    // Project.prototype 添加 getWorkers 和 setWorkers.
    

    belongsToMany

    belongsToMany 方法用于多对多关系.

    Project.belongsToMany(User, {through: 'UserProject'});
    User.belongsToMany(Project, {through: 'UserProject'});
    

    上例中会新建 UserProject 模型, 拥有两个外键 userIdprojectId.
    定义多对多关系时必须指定 through 属性.

  • 相关阅读:
    [转]红帽 Red Hat Linux相关产品iso镜像下载【百度云】
    JAVA中的类
    Java并发编程:Lock
    字符集和编码的区别
    MySQL索引背后的数据结构及算法原理
    B树、B-树、B+树、B*树 红黑树
    linux下nginx的安装
    对.net orm工具Dapper在多数据库方面的优化
    Dapper使用方法
    filebeat to elasticsearch配置
  • 原文地址:https://www.cnblogs.com/wbin91/p/5925489.html
Copyright © 2011-2022 走看看