Adonis JS v5 关系缺少模型属性
Adonis JS v5 relationship missing model attribute
我正在学习如何使用 Adonis framework (v5) 并且按照传统规定,我正在创建一个待办事项列表 api 来测试出来了。
我遇到的问题是关于 User
和 Todo
实体之间的关系。
以下是两个模型:
// 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 条目和 link 作者的 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
模型上。
我怎样才能解决这个问题并启动我的待办事项应用程序并运行?
提前致谢!
错误是您的模型中缺少一个字段。
您需要使用 @column()
装饰器定义所有字段。在您的示例中,您没有定义列 author
.
创建关系时,必须有一个列(FK)和一个关系。
如果我们假设您的 todos
table 中有一列 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 framework (v5) 并且按照传统规定,我正在创建一个待办事项列表 api 来测试出来了。
我遇到的问题是关于 User
和 Todo
实体之间的关系。
以下是两个模型:
// 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 条目和 link 作者的 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
模型上。
我怎样才能解决这个问题并启动我的待办事项应用程序并运行?
提前致谢!
错误是您的模型中缺少一个字段。
您需要使用 @column()
装饰器定义所有字段。在您的示例中,您没有定义列 author
.
创建关系时,必须有一个列(FK)和一个关系。
如果我们假设您的 todos
table 中有一列 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>
}