angular 如何从一对多相关的两个表中获取嵌套对象数组
angular how to get array of nested object from two tables one-to-many related
大家好,我有 2 个 mysql 表:
itemsClass 包含可能的 classes 列表,itemType 引用 itemClass 并包含特定 [=40] 的类型值=].
我正在尝试构建一个 return 是 Observable 的服务, 结合两个 http.get Observables,适合这个接口:
interface Item{
itemcClassId:any; //itemClass.id, from itemClass select
itemClassName:any; //itemClass.name from itemClass select
itemTypeValue?:any; //from itemType select, if itemType contains only a value of the first table's class
itemTypeValues?:any[]; //if itemType's values are multiple
}
我遇到了(经过无限搜索)这样的代码结构
getEmploye(name: string): Observable<any> {
return this.getClass(name).pipe(
switchMap((response) => {
return forkJoin(of(response),this.getType(class.id);),
map(res=>{
return {...res[0],values:...res[1]}
})
})
)
}
但它会 return 单个项目,而我需要一组项目..
有什么提示吗?
谢谢大家
编辑:
我粘贴的代码不是定制的,只是粘贴,因为它似乎符合类似的需求(或至少部分);
自定义版本(return只有一项)将包含(据我所知)如下内容:
getItem(id: number): Observable<Item> {
return this.http.get(url_to_ItemClass_rest_api).pipe(
switchMap((item) => {
return forkJoin(of(item),
this.http.get(url_to_ItemType_rest_api_filtered_by_foreign_key_item.id/);),
map(res=>{
return {...res[0],values:...res[1]}
})
})
)
}
forkjoin 在该模式下已弃用。你必须传递一个数组::
forkjoin([of(item),
this.http.get(url_to_ItemType_rest_api_filtered_by_foreign_key_item.id/)])
如果你想要一个带有键和值的单个 return,你可以 return 像这样:const ret = { ...res[0], values: res[1] } ;
getEmploye(id: number): Observable<any> {
return this.getClass(id).pipe(
switchMap(item => {
return forkJoin([of(item), this.getType(item.id)]).pipe(
map(res => {
const ret = { ...res[0], values: res[1] };
return ret;
})
);
})
);
}
对于数组尝试这样的事情:
getClass(名称: 数字): Observable>
getType(classId: string): Observable>
getEmploye(id: number): Observable<any> {
return this.getClass(id).pipe(
switchMap(items => {
const forkRequest: Array<any> = [of(items)];
items.forEach( item => forkRequest.push(this.getType(item.id)));
return forkJoin(forkRequest).pipe(
map((res: Array<any>) => {
const returnList: Array<{id: string, values: Array<any>}> = [];
res.forEach((item: any, index: number) => {
if (index > 0) {
const returnObj = { id: res[0][index - 1].id, values: item };
returnList.push(returnObj);
}
});
return returnList;
})
);
})
);
}
大家好,我有 2 个 mysql 表: itemsClass 包含可能的 classes 列表,itemType 引用 itemClass 并包含特定 [=40] 的类型值=].
我正在尝试构建一个 return 是 Observable
interface Item{
itemcClassId:any; //itemClass.id, from itemClass select
itemClassName:any; //itemClass.name from itemClass select
itemTypeValue?:any; //from itemType select, if itemType contains only a value of the first table's class
itemTypeValues?:any[]; //if itemType's values are multiple
}
我遇到了(经过无限搜索)这样的代码结构
getEmploye(name: string): Observable<any> {
return this.getClass(name).pipe(
switchMap((response) => {
return forkJoin(of(response),this.getType(class.id);),
map(res=>{
return {...res[0],values:...res[1]}
})
})
)
}
但它会 return 单个项目,而我需要一组项目.. 有什么提示吗?
谢谢大家
编辑: 我粘贴的代码不是定制的,只是粘贴,因为它似乎符合类似的需求(或至少部分);
自定义版本(return只有一项)将包含(据我所知)如下内容:
getItem(id: number): Observable<Item> {
return this.http.get(url_to_ItemClass_rest_api).pipe(
switchMap((item) => {
return forkJoin(of(item),
this.http.get(url_to_ItemType_rest_api_filtered_by_foreign_key_item.id/);),
map(res=>{
return {...res[0],values:...res[1]}
})
})
)
}
forkjoin 在该模式下已弃用。你必须传递一个数组::
forkjoin([of(item),
this.http.get(url_to_ItemType_rest_api_filtered_by_foreign_key_item.id/)])
如果你想要一个带有键和值的单个 return,你可以 return 像这样:const ret = { ...res[0], values: res[1] } ;
getEmploye(id: number): Observable<any> {
return this.getClass(id).pipe(
switchMap(item => {
return forkJoin([of(item), this.getType(item.id)]).pipe(
map(res => {
const ret = { ...res[0], values: res[1] };
return ret;
})
);
})
);
}
对于数组尝试这样的事情:
getClass(名称: 数字): Observable
getType(classId: string): Observable
getEmploye(id: number): Observable<any> {
return this.getClass(id).pipe(
switchMap(items => {
const forkRequest: Array<any> = [of(items)];
items.forEach( item => forkRequest.push(this.getType(item.id)));
return forkJoin(forkRequest).pipe(
map((res: Array<any>) => {
const returnList: Array<{id: string, values: Array<any>}> = [];
res.forEach((item: any, index: number) => {
if (index > 0) {
const returnObj = { id: res[0][index - 1].id, values: item };
returnList.push(returnObj);
}
});
return returnList;
})
);
})
);
}