Adonis JS v5 关系缺少模型属性

Posted

技术标签:

【中文标题】Adonis JS v5 关系缺少模型属性【英文标题】:Adonis JS v5 relationship missing model attribute 【发布时间】:2021-08-05 08:21:59 【问题描述】:

我正在学习如何使用Adonis framework (v5),按照传统规定,我正在创建一个待办事项列表 API 来测试它。

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

这是两个模型:

// 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

// 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 条目链接到他们的作者。 The documentation provides us with an example 但我看不出我做错了什么。

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

// 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 模型上。

我该如何解决这个问题并让我的待办事项应用程序启动并运行?

提前谢谢你!

【问题讨论】:

【参考方案1】:

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

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

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

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

这是一个正确的例子:

class User extends BaseModel 
  // ...
  @hasMany(() => Todo)
  todos: HasMany<typeof Todo>


class Todo extends BaseModel 
  @column()
  user_id: number

  @belongsTo(() => User)
  author: BelongsTo<typeof User>

【讨论】:

这完美!非常感谢您的帮助! 有帮助,谢谢

以上是关于Adonis JS v5 关系缺少模型属性的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP升级指导

反对 js:无法使用连接表额外属性更新多对多关系。说附加属性无效

JPA 元模型生成缺少属性

D3.js的v5版本入门教程(第十章)

TypeError.无法读取未定义的'$__'属性。无法读取未定义的'$__'属性 - Mongoose v5.^。

代码 = 134110 - 验证错误缺少强制目标属性上的属性值