Adonis 5数据透视表计算列实现方法咨询
Adonis 5 Lucid多对多透视表计算列实现方案
可以给多对多关联的透视表额外字段设置计算列,不过不能直接在@manyToMany装饰器里套用普通模型的@computed()方式,得通过自定义透视表模型来实现,具体步骤如下:
1. 创建自定义透视表模型
为多对多的透视表单独创建模型(比如用户与技能的透视表user_skills,模型命名为UserSkill),在这个模型里定义计算列:
import { BaseModel, column, computed } from '@ioc:Adonis/Lucid/Orm' export default class UserSkill extends BaseModel { public static table = 'user_skills' @column({ isPrimary: true }) public id: number @column() public userId: number @column() public skillId: number // 透视表原始字段 @column() public proficiency: number // 定义计算列:将 proficiency 转换为文字等级 @computed() public get proficiencyLevel() { if (this.proficiency >= 80) return '精通' if (this.proficiency >= 50) return '熟练' return '入门' } }
2. 修改多对多关联配置
在主模型(比如User模型)的@manyToMany装饰器中,指定pivotModel为刚创建的自定义透视表模型,同时保留pivotColumns声明需要的原始字段:
import { manyToMany, ManyToMany } from '@ioc:Adonis/Lucid/Orm' import Skill from 'App/Models/Skill' import UserSkill from 'App/Models/UserSkill' export default class User extends BaseModel { // ...其他模型字段 @manyToMany(() => Skill, { pivotColumns: ['proficiency'], pivotModel: () => UserSkill, // 指定自定义透视表模型 }) public skills: ManyToMany<typeof Skill> }
3. 访问计算列
查询关联数据后,通过透视表的额外属性获取计算列:
const user = await User.find(1) await user.load('skills') user.skills.forEach((skill) => { // 原始透视字段 console.log(skill.$extras.pivot_proficiency) // 计算列字段 console.log(skill.$extras.pivot_proficiencyLevel) })
注意事项
- 计算列是在模型层面实时计算的,不会存储到数据库中;
- 如果需要基于数据库多个字段计算,直接在
@computed()的getter中访问模型的其他字段即可; - 自定义透视表模型还支持添加钩子、验证规则等其他模型特性,扩展性更强。
内容的提问来源于stack exchange,提问作者w3bsite
相关产品推荐
相关产品推荐

