首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Adonis JS v5关系缺少模型属性

Adonis JS v5关系缺少模型属性
EN

Stack Overflow用户
提问于 2021-08-05 08:21:59
回答 1查看 1.9K关注 0票数 3

我正在学习如何使用Adonis框架 (v5),并且根据传统的要求,我正在创建一个todo列表api来测试它。

我遇到的问题是关于UserTodo实体之间的关系。

以下是两种模式:

代码语言:javascript
运行
复制
// file: app/Models/Todo.ts

export default class Todo extends BaseModel {
  @column({ isPrimary: true })
  public id: number

  @belongsTo(() => User, {
    foreignKey: 'id',
  })
  public author: BelongsTo<typeof User>

  @column()
  public completed: boolean

  @column()
  public title: string

  @column()
  public description: string | null

  @column.dateTime({ autoCreate: true })
  public createdAt: DateTime

  @column.dateTime({ autoCreate: true, autoUpdate: true })
  public updatedAt: DateTime
}
代码语言:javascript
运行
复制
// file: app/Models/User.ts

export default class User extends BaseModel {
  @column({ isPrimary: true })
  public id: number

  @column()
  public username: string

  @column({ serializeAs: null })
  public password: string

  @hasMany(() => Todo, {
    foreignKey: 'author',
  })
  public todos: HasMany<typeof Todo>

  @column.dateTime({ autoCreate: true })
  public createdAt: DateTime

  @column.dateTime({ autoCreate: true, autoUpdate: true })
  public updatedAt: DateTime

  @beforeSave()
  public static async hashPassword(user: User) {
    if (user.$dirty.password) {
      // Only hash password if required
      user.password = await Hash.make(user.password)
    }
  }
}

我没有包括迁移文件,但是如果需要的话,我会编辑这个问题。

我所期望的是,我应该能够创建用户并将其保存到我的数据库中,对于Todo条目也是如此,并将todo条目链接到他们的作者。文档为我们提供了一个示例,但我不知道我在哪里做错了什么。

因此,为了测试它,我使用node ace repl命令,如下所示:

代码语言:javascript
运行
复制
// log of running the commands in the AdonisJS v5 REPL
> loadModels()
recursively reading models from "app/Models"
Loaded models module. You can access it using the "models" variable
> undefined
> const testUser = await models.User.create({ username: 'testUser', password: 'password' })
undefined
> await testUser.related('todos').create({ title: 'Example todo entry' })
Uncaught:
Exception: E_MISSING_MODEL_ATTRIBUTE: "User.todos" expects "author" to exist on "Todo" model, but is missing
    at <my-app-directory>\REPL23:1:39
    at Proxy.related (<my-app-directory>\node_modules\@adonisjs\lucid\build\src\Orm\BaseModel\index.js:1436:18)
    at HasMany.boot (<my-app-directory>\node_modules\@adonisjs\lucid\build\src\Orm\Relations\HasMany\index.js:74:12)
    at KeysExtractor.extract (<my-app-directory>\node_modules\@adonisjs\lucid\build\src\Orm\Relations\KeysExtractor.js:28:39)
    at Array.reduce (<anonymous>)
    at <my-app-directory>\node_modules\@adonisjs\lucid\build\src\Orm\Relations\KeysExtractor.js:32:23
>

我不理解错误消息,因为author实际上存在于Todo模型中。

我怎样才能解决这个问题,让我的todo应用程序启动和运行?

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-06 07:12:20

错误是模型中缺少一个字段。

您需要使用@column()装饰器定义所有字段。在您的示例中,您没有定义列author

创建关系时,必须有一个列( FK)和一个关系。

如果假设您的todos表中有一个列user_id,那么您需要在Todo模型中添加列user_id

下面是一个正确的例子:

代码语言:javascript
运行
复制
class User extends BaseModel {
  // ...
  @hasMany(() => Todo)
  todos: HasMany<typeof Todo>
}

class Todo extends BaseModel {
  @column()
  user_id: number

  @belongsTo(() => User)
  author: BelongsTo<typeof User>
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68663013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档