Firebase Angular:如何通过 OrderId 获取订单

时间:2021-01-18 00:55:15

标签: javascript firebase-realtime-database angularfire2

我关于 SO 的第一个问题,请原谅我无意的疏忽!

Firebase 表: Firebase table

订单数据模型: Order data model

ShoppingCart 数据模型: ShoppingCart data model

最后是我的 ShoppingCartItem 数据模型: ShoppingCartItem data model

我想要实现的目标:我试图传递订单键并获取该订单 ID 的整个订单详细信息。

这是我的组件:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs/internal/Subscription';
import { OrderService } from 'shared/services/order.service';

@Component({
  selector: 'myorder',
  templateUrl: './myorder.component.html',
  styleUrls: ['./myorder.component.css']
})
export class MyorderComponent implements OnInit {
  myOrder$: any = {};
  orders$;
  ordersbyOrderId$;
  userId: string;
  user: any;
  subscription: Subscription;
  id;
  constructor(private orderService: OrderService, private route: ActivatedRoute) { }

  async ngOnInit() {
    this.id = this.route.snapshot.paramMap.get('id');
    this.myOrder$ = this.orderService.getOrdersByOrderId(this.id);
    console.log(this.myOrder$);
  }
}

还有,我的服务:

import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireList, AngularFireObject } from '@angular/fire/database';
import { map } from 'rxjs/operators';
import { Order } from 'shared/models/order';
import { ShoppingCartService } from './shopping-cart.service';

@Injectable({
  providedIn: 'root'
})
export class OrderService {
  y: any;
  userId: string;
  myOrders: Order[] = [];

  constructor(private db: AngularFireDatabase,
    private shoppingCartService: ShoppingCartService) { }

  getOrderByOrderId(orderId: string) {
    return this.db.list("/Orders", (ref) => {
      console.log(ref.orderByChild("key").equalTo(orderId));//getting the params key here
      return ref.orderByChild("key").equalTo(orderId);
    })
  }

  getOrdersByUser(userId: string) {
    console.log(userId);
    this.userId = userId;
    return this.db.list("/Orders", (ref) => {
      return ref.orderByChild("userId").equalTo(userId);
    }).snapshotChanges().pipe(
      map((orders: any) => orders.map(prod => {
        const payload = prod.payload.val();
        const key = prod.key;
        return <Order>{ key, ...payload };
      })),
    );
  }

我正在从 getOrdersByUser() 获取数据,但无法按订单 ID 获取数据。事实上,我应该使用 getOrdersByUser() 数组(Firebase 列表),然后使用订单 ID 进一步过滤它,因为它持有同一用户的订单。

提前致谢,如果我能提供更多信息,请告诉我。

老实说,我不太擅长查询 Firebase。希望他们会提供扩展方法来传递参数并完成所有映射等。

PS:Angular 和 Firebase 都是最新版本。

0 个答案:

没有答案