美文网首页
Adonis.js——数据库关联

Adonis.js——数据库关联

作者: 赫鲁晓夫的玉米棒子 | 来源:发表于2018-07-30 17:43 被阅读0次

    一对一

    上一篇文章中新建了一个‘user'和’profile‘表,一个用户对应一个用户的详细资料,此为一对一的关系。
    database/migrations/1532938278888_profile_schema.js中修改表格结构:

    'use strict'
    const Schema = use('Schema')
    class ProfileSchema extends Schema {
      up () {//创建时执行内容
        this.create('profiles', (table) => {
          table.increments() // id字段
          //这里是手动添加的---------
          table.string('userNick')
          table.string('introduction')
          table.integer('age')
          table.integer('user_id').unsigned()
          table.foreign('user_id').references('users.id')
          /* 将 user_id 与 users 表格中的id关联起来,
          由于创建表格会默认在最后添加's',
          所以 user 表格在这里写作 'users' */
          //---------------------------------
          table.timestamps()
        })
      }
      down () {//回滚时执行内容
        this.drop('profiles')
      }
    }
    module.exports = ProfileSchema
    

    然后,可以将之前创建好的表格手动删除后再重新'adonis migration:run' 重新创建有关联关系的表格。然后创建seeder插入数据。

    'use strict'
    const Factory = use('Factory')
    const Profile = use('App/Models/Profile')
    class ProfileSeeder {
      async run() {
        const profile = [{
            userNick: '尼基塔·谢尔盖耶维奇·赫鲁晓夫',
            age: 76,
            introduction: '吃玉米吧',
            user_id: 1,
          },
          {
            userNick: '列昂尼德·伊里奇·勃列日涅夫',
            age: 76,
            introduction: '别说话,看我的勋章',
            user_id: 2,
          },
        ]
        await Profile.createMany(profile)
      }
    }
    module.exports = ProfileSeeder
    
    λ adonis seed --files ProfileSeeder.js
    Seeded database in 208 ms
    

    在'app/Models/User.js'中,添加一个方法,使用'hasOne'来描述这个一对一的关系。

    ……
    class User extends Model {
      profile(){
        return this.hasOne('App/Models/Profile')
      }
       ……
    }
    ……
    

    当然,还有个belongsTo的关系,是hasOne关系的反向关联,可以在Profile中定义其属于User

    一对多

    一个用户是多个文章的作者,这便构成了一对多的关系。
    跟一对一一样,创建一个article的模型和迁移,并使用seed填充数据。再到App/Models/User.js中添加一个方法,使用hasMany来描述一对多的关系。

    ……
    class User extends Model {
      //这是之前添加的一对一的关系
      profile(){
        return this.hasOne('App/Models/Profile')
      }
      //这是新添加的一对多的关系
      article(){
        return this.hasMany('App/Models/Article')
      }
      ……
    }
    ……
    

    多对多

    一篇文章可以对应多个标签,一个标签又可以用于多篇文章。这就是多对多的关系。
    通过以下语句生成、填充一个tags表格。

    adonis make:migration tag //构建迁移
    ……
    adonis make:model tag //构建模型
    ……
    adonis make:seed tag //生成seeder用于填充
    ……
    adonis migration:run //运行迁移,生成表格(空)
    ……
    adonis seed --files TagSeeder.js //运行seeder文件填充表格
    ……
    

    为了创建一个多对多的关系,我们需要创建一个中间表,这个中间表有个专门的名词“pivot”,其中记录文章id以及标签id。
    创建pivot migration,以及用于填充的seeder。

    λ adonis make:migration article_tag
    > Choose an action Create table
    √ create  database\migrations\1533003492037_article_tag_schema.js
    
    λ adonis make:seed article_tag_pivot
    √ create  database\seeds\ArticleTagPivotSeeder.js
    

    database/migrations/1533003492037_article_tag_schema.js 文件中,添加两个外键,分别与文章id以及标签id相关联。

    'use strict'
    const Schema = use('Schema')
    class ArticleTagSchema extends Schema {
      up () {
        this.create('article_tag', (table) => {
          table.increments()
          table.integer('article_id').unsigned()
          table.foreign('article_id').references('articles.id')
          table.integer('tag_id').unsigned()
          table.foreign('tag_id').references('tags.id')
        })
      }
      down () {
        this.drop('article_tag')
      }
    }
    module.exports = ArticleTagSchema
    

    然后再在database/seeds/ArticleTagPivotSeeder.js中进行数据填充。因为这次没有创建模型,所以填充与之前略有不同:

    'use strict'
    const Factory = use('Factory')
    const Database = use('Database')
    class ArticleTagPivotSeeder {
      async run () {
        await Database.table('article_tag').insert([
          {article_id:1,tag_id:1},
          {article_id:1,tag_id:4},
          {article_id:3,tag_id:2},
          {article_id:4,tag_id:2},
          {article_id:2,tag_id:3},
        ])
      }
    }
    module.exports = ArticleTagPivotSeeder
    

    App/Models目录下的 Article.js 以及 Tag.js 中分别添加:

    //-----Article.js
    class Article extends Model {
      tags(){
        return this.belongsToMany('App/Models/Tag')
      }
    }
    //-----Tag.js
    class Tag extends Model {
      article(){
        return this.belongsToMany('App/Models/Article)
      }
    }
    
    

    之后运行迁移并运行对应seeder文件。

    相关文章

      网友评论

          本文标题:Adonis.js——数据库关联

          本文链接:https://www.haomeiwen.com/subject/szgfvftx.html