AdonisJS v5多对多关联未加载全部列问题求助
解决AdonisJS v5多对多关联加载模型字段丢失问题
问题根源
你的Family模型中,name等核心字段没有使用@column装饰器标记为数据库列。AdonisJS的BaseModel只会将带有@column装饰器的字段识别为模型属性,未标记的字段会被归类到$extras中,序列化时自然不会被输出。
修复步骤
修改Family模型,为所有需要从数据库加载并参与序列化的字段添加对应装饰器:
import { BaseModel, column, manyToMany, ManyToMany, DateTime } from '@ioc:Adonis/Lucid/Orm' import User from './User' export default class Family extends BaseModel { @column({ isPrimary: true }) public id: Buffer; @column({ serializeAs: null }) public UserId: Buffer; // 为name字段添加@column装饰器 @column() public name: string; // 日期类型字段使用@column.dateTime装饰器 @column.dateTime({ autoCreate: true }) public createdAt: DateTime; @column.dateTime({ autoCreate: true, autoUpdate: true }) public updatedAt: DateTime; @manyToMany(() => User) public users: ManyToMany<typeof User>; }
额外优化说明
- 若中间表(FamilyToUser)使用了自定义命名或包含额外字段,可在关联装饰器中明确配置:
// 在User模型的families关联中补充配置(按需使用) @manyToMany(() => Family, { pivotTable: 'family_to_user', // 自定义中间表名称 pivotColumns: ['join_time'] // 需要加载的中间表额外字段 }) public families: ManyToMany<typeof Family>;
- 序列化时无需手动遍历关联,直接调用模型的
serialize()方法即可自动包含关联数据:
const user = await User.findBy('email', 'email@email.com') await user.load('families', (familyQuery) => { familyQuery.whereNull('deleted'); }) // 直接序列化整个用户对象,关联的families会包含所有标记字段 console.log(user.serialize())
内容的提问来源于stack exchange,提问作者LeeR
相关产品推荐
相关产品推荐

