一对一
在上一篇文章中新建了一个‘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文件。
网友评论