首页 > 解决方案 > 使用 firebase 搜索用户订单并按日期排序(最新的优先)

问题描述

我在firebase中有一个这样的订单表 在此处输入图像描述

在我的 iOS 应用程序中,我想显示处于活动状态的用户的订单,并希望按 (CreateDate) 对它们进行排序以显示最新的第一

我正在使用此代码,它只显示用户订单而不按日期排序

 if   (Auth.auth().currentUser != nil) {
        let user = Auth.auth().currentUser
        if let user = user {
            uid = user.uid

            print("uid = \(uid)")


            // get order details
            let ordersRef = rootRef.child("orders")
            ordersRef.queryOrdered(byChild: "clientuid_status").queryEqual(toValue: "\(uid)_0").observe(.childAdded, with: { (snapshot) -> Void in

                let snabshotvalue = snapshot.value as? [String : AnyObject]
                let dateorder = snabshotvalue!["orderDate"]
                let tecname = snabshotvalue!["tecname"]
                let theproblem = snabshotvalue!["theproblem"]
                let homeadress = snabshotvalue!["homeadress"]
                let clintlat = snabshotvalue!["clintlat"]
                let clintlong = snabshotvalue!["clintlong"]
                let clintuid = snabshotvalue!["clintuid"]
                let tecuid =  snabshotvalue!["tecuid"]
                let tecToken  = snabshotvalue!["tecToken"]
                let status = snabshotvalue!["status"]
                let servicetable = snabshotvalue!["servicetable"]

                let snashotkey = snapshot.key as String
                print("firstname: \(tecname) ")

                self.dateArray.append(dateorder as? String)
                self.tecnameArray.append(tecname as? String)
                self.problemArray.append(theproblem as? String)
                self.homeadressArray.append(homeadress as? String)
                self.clintlatArray.append(clintlat as? String)
                self.clintlongArray.append(clintlong as? String)
                self.tecuidArray.append(tecuid as? String)
                self.tecTokenArray.append(tecToken as? String)
                self.orderuidArray.append(snashotkey )
                self.clintidArray.append(clintuid as? String)
                self.statusArray.append(status as? String)
                self.servicetableArray.append(servicetable as? String)

                self.getTechRatin(teckUid: tecuid as! String)

                self.tableView.reloadData()
            })


            }

我收到了 Firebase 支持的票,他们告诉我使用此代码:

    let orderOrdersByCreatedDate= (ref.child("orders").child(getUid())).queryOrdered(byChild: "createDate").queryLimited(toLast: 1)

当我尝试使用您的代码时,我收到此错误:使用未解析的标识符“getUid”

我不知道如何使用 getUid()

标签: iosswiftfirebasefirebase-realtime-database

解决方案


最后一段代码是错误的。creadeDate要按您需要的顺序对订单进行排序:

ordersRef.queryOrdered(byChild: "creadeDate").observe(.childAdded, ...

但是 Firebase 数据库查询只能对单个属性进行排序/过滤,这意味着您不能再clientuid_status像现在那样进行过滤。

在许多情况下,可以将要过滤的值组合成一个(合成)属性。您似乎已经使用 完成了此操作clientuid_status,并允许对其进行过滤和按日期排序,您将其扩展为clientuid_status_creadeDate并对其进行排序/过滤。

有关此方法和其他方法的示例,请在此处查看我的答案:http ://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase


推荐阅读