是否可以在 mikro-orm 中选择嵌套实体的属性?
Is it possible to choose the properties of nested entities in mikro-orm?
我正在使用 mikro-orm 和 express 在后端控制器中进行以下简单设置:
const getOrigins = async (_: Request, res: Response) => {
try {
const origins = await orm.em.find(Origin, {}, { populate: ['country'] });
res.status(200).send(origins);
} catch (error) {
console.error(error);
res.status(500).send(error);
}
};
这些是我正在使用的实体的简化版本:
export abstract class Base<T extends { id: string }> extends BaseEntity<T, 'id'> {
@PrimaryKey({ type: 'uuid' })
public id: string = v4();
@Property()
public createdAt: Date = new Date();
@Property({ onUpdate: () => new Date() })
public updatedAt: Date = new Date();
constructor(body = {}) {
super();
this.assign(body);
}
}
@Entity()
export class Country extends Base<Country> {
@Property()
@Unique()
country: string;
@OneToMany(() => Origin, o => o.country)
origins = new Collection<Origin>(this);
constructor(country: string) {
super();
this.country = country;
}
}
@Entity()
export class Origin extends Base<Origin> {
@ManyToOne(() => Country, { cascade: [Cascade.PERSIST] })
country;
constructor(country: Country) {
super();
this.country = country;
}
}
代码应该 return 一个包含国家/地区的来源列表。
到目前为止,代码运行良好,但它正在 returning 以下对象:
[
{
"id": "0cda300f-57a3-406f-8167-271ee1db519f",
"createdAt": "2021-03-06T22:19:54.000Z",
"updatedAt": "2021-03-06T22:19:54.000Z",
"country": {
"id": "801a73af-4fc7-46d7-b5c4-0f8fcd2024d5",
"createdAt": "2021-03-06T22:10:58.000Z",
"updatedAt": "2021-03-06T22:10:58.000Z",
"country": "UK"
}
}
]
有没有一种方法可以使用查询参数过滤嵌套实体的 returned 属性,使其 return 成为一个更简单的对象,例如:
[
{
"id": "0cda300f-57a3-406f-8167-271ee1db519f",
"createdAt": "2021-03-06T22:19:54.000Z",
"updatedAt": "2021-03-06T22:19:54.000Z",
"country": "UK"
}
]
我尝试了多种语法变体,但似乎找不到合适的。 mikro-orm 上的文档在这个具体案例中并不太清楚。
提前感谢您的帮助
您可以做的事情很少:
如果您关心查询,可以通过 fields
:
使用部分加载
https://mikro-orm.io/docs/entity-manager/#fetching-partial-entities
如果您只想控制序列化实体的形状,实现自定义 toJSON
或使用 属性 序列化程序:
我正在使用 mikro-orm 和 express 在后端控制器中进行以下简单设置:
const getOrigins = async (_: Request, res: Response) => {
try {
const origins = await orm.em.find(Origin, {}, { populate: ['country'] });
res.status(200).send(origins);
} catch (error) {
console.error(error);
res.status(500).send(error);
}
};
这些是我正在使用的实体的简化版本:
export abstract class Base<T extends { id: string }> extends BaseEntity<T, 'id'> {
@PrimaryKey({ type: 'uuid' })
public id: string = v4();
@Property()
public createdAt: Date = new Date();
@Property({ onUpdate: () => new Date() })
public updatedAt: Date = new Date();
constructor(body = {}) {
super();
this.assign(body);
}
}
@Entity()
export class Country extends Base<Country> {
@Property()
@Unique()
country: string;
@OneToMany(() => Origin, o => o.country)
origins = new Collection<Origin>(this);
constructor(country: string) {
super();
this.country = country;
}
}
@Entity()
export class Origin extends Base<Origin> {
@ManyToOne(() => Country, { cascade: [Cascade.PERSIST] })
country;
constructor(country: Country) {
super();
this.country = country;
}
}
代码应该 return 一个包含国家/地区的来源列表。 到目前为止,代码运行良好,但它正在 returning 以下对象:
[
{
"id": "0cda300f-57a3-406f-8167-271ee1db519f",
"createdAt": "2021-03-06T22:19:54.000Z",
"updatedAt": "2021-03-06T22:19:54.000Z",
"country": {
"id": "801a73af-4fc7-46d7-b5c4-0f8fcd2024d5",
"createdAt": "2021-03-06T22:10:58.000Z",
"updatedAt": "2021-03-06T22:10:58.000Z",
"country": "UK"
}
}
]
有没有一种方法可以使用查询参数过滤嵌套实体的 returned 属性,使其 return 成为一个更简单的对象,例如:
[
{
"id": "0cda300f-57a3-406f-8167-271ee1db519f",
"createdAt": "2021-03-06T22:19:54.000Z",
"updatedAt": "2021-03-06T22:19:54.000Z",
"country": "UK"
}
]
我尝试了多种语法变体,但似乎找不到合适的。 mikro-orm 上的文档在这个具体案例中并不太清楚。 提前感谢您的帮助
您可以做的事情很少:
如果您关心查询,可以通过
使用部分加载fields
:https://mikro-orm.io/docs/entity-manager/#fetching-partial-entities
如果您只想控制序列化实体的形状,实现自定义
toJSON
或使用 属性 序列化程序: