You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>;
}

额外优化说明

  1. 若中间表(FamilyToUser)使用了自定义命名或包含额外字段,可在关联装饰器中明确配置:
// 在User模型的families关联中补充配置(按需使用)
@manyToMany(() => Family, {
  pivotTable: 'family_to_user', // 自定义中间表名称
  pivotColumns: ['join_time'] // 需要加载的中间表额外字段
})
public families: ManyToMany<typeof Family>;
  1. 序列化时无需手动遍历关联,直接调用模型的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:27:34