我正在尝试将我的原始查询转换为使用在ORM和QueryBuilder系统中构建的AdonisJS,目前在我的原始查询中,我从不同的表中构建对象,以便在将不同对象类型传递到前端时获得更好的组织。例如,在创建一个角色对象的情况下,获取用户可能看起来如下所示
SELECT
u.id,
json_build_object(
'name', role.name
) AS role
FROM users u
LEFT JOIN roles role
ON role.id = u.role_id
如果用户ORM看起来像
export default class User extends BaseModel {
public static table = TABLES.USERS
@column({ isPrimary: true })
public id: number
@column()
public unique_id: string
@column()
public email: string
@column({
serializeAs: null,
})
public first_name: string
@column({
serializeAs: null,
})
public last_name: string
@computed()
public get name() {
return {
first: this.first_name,
last: this.last_name,
full: `${this.first_name} ${this.last_name}`,
}
}
@column()
public active: boolean
@hasOne(() => Role)
public role: HasOne<typeof Role>
}
而ORM所扮演的角色
export default class Role extends BaseModel {
public static table = TABLES.ROLES
@column({ isPrimary: true })
public id: number
@column()
public name: string
@column()
public options: string[]
@column()
public permissions: string[]
@column()
public widgets: string[]
@column()
public locked: boolean
@belongsTo(() => User)
public user: BelongsTo<typeof User>
}
是否有任何方法从用户ORM/QueryBuilder中自动加入链接到用户的角色?我已经查看了Adonis文档,特别是有关关系的文档,但我看到的大多数内容是,除了为表编写联接语句之外,在本例中,除了为表编写联接语句之外,您还可以在事实之后获得相关表中的角色,但不能在查询本身中获得。如果它必须来自一个连接,那么是否有一种方法可以使用角色ORM来处理类似于await User.all()
工作方式的字段,或者它必须是一个自定义的选择?
不确定是否有必要,但我目前正在使用Adonis Core v5.8.3、Adonis Lucid v18.0.1和Adonis Repl v3.1.11,如果这有帮助的话。如果我问的问题看起来很复杂,就让我知道哪里需要澄清,我会澄清的。谢谢!
发布于 2022-08-04 00:43:18
我发现角色ORM上的hasMany
装饰器和用户ORM上的belongsTo
装饰器的组合将两者连接在一起,然后使用preload
查询函数允许角色自动连接到用户。
角色ORM中的User属性
@hasMany(() => User, {
foreignKey: 'role_id',
})
public users: HasMany<typeof User>
用户ORM中的角色属性
@column({
serializeAs: null
})
public role_id: number
@belongsTo(() => Role, {
foreignKey: 'role_id',
})
public role: BelongsTo<typeof Role>
提取逻辑
const users = await User.query().preload('role').paginate(params.page, params.limit)
https://stackoverflow.com/questions/73228157
复制相似问题