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;
          })
        );
      })
    );
  }