【问题标题】:Firebase Filtering data with PHPFirebase 使用 PHP 过滤数据
【发布时间】:2019-01-23 19:14:04
【问题描述】:

我正在使用 firebase 最新库 (4.15.1) 我想查询,

"SELECT * FROM `users` WHERE `email`='mail@mail.com' and firstanme='John'"

我的代码是,但它不起作用。

return $this->database->getReference($this->dbname)->hasChildren('email')->getValue();

这是我的 firebase 数据结构。

【问题讨论】:

    标签: php firebase


    【解决方案1】:

    hasChildren('email') 可能会返回 boolean 值...

    $email = $firebase
               ->getReference("users/{$uid}/profile/email")
               ->getValue();
    

    equalTo 可用于制定WHERE 条件。

    $user = $firebase->getReference("users/{$uid}")
    
               ->orderByChild("email")
               ->equalTo("mail@mail.com")
    
               ->limitToFirst(1)
               ->getSnapshot();
    

    或者也可以进行类似过滤:

               ->orderByChild("email")
               ->startAt("mail@mail.com")
               ->endAt("mail@mail.com")
    

    【讨论】:

    • 感谢您的回复,主要是我想要带有查询的 10 或 20 之类的数据集。就像我放了一个示例 SQL 查询一样。
    • 得到一个新的错误先生,调用未定义的方法 Kreait\Firebase\Database\Reference::get()
    • 根据您的最新建议出现此错误:此查询已订购
    • @SilaKhatun Kreait 可能只支持一个标准; ->orderByChild("firstname")->equalTo("John") 必须省略;当获取整个profile 作为快照时,仍然可以检查firstname 的值。
    • 索引未定义
    【解决方案2】:

    hasChildren('email') 返回 bool 值,不能与 ->getValue() 方法链接。

    【讨论】:

    • 它只能获得一个用户,但我需要一次获得 10 或 20 个用户。
    • 因为在这个例子中你只会得到 1 个孩子......如果你想选择所有获得参考的项目并获取所有值$this->database->getReference($this->dbname)->getValue();
    • 这是返回所有值,但我只需要过滤值先生。
    • 所以这是一个很好的答案:stackoverflow.com/questions/51883615/…
    【解决方案3】:

    Firebase 实时数据库是一个 NoSQL 数据库,而不是关系数据库,也不能作为一个数据库使用 - 这就是为什么像您正在寻找的那样的查询可能永远不可能开箱即用。

    您可以在https://firebase.google.com/docs/database/rest/retrieve-data 上查看所有过滤和排序功能(在“过滤数据”、“复杂过滤”和“数据如何排序”部分)。

    PHP SDK 增加一点便利的地方是它消除了 Firebase API 返回无序数据的限制(以下部分来自https://firebase.google.com/docs/database/rest/retrieve-data#section-rest-filtering 上的红框

    过滤后的数据无序返回:使用 REST API 时,过滤后的结果按未定义的顺序返回,因为 JSON 解释器不强制执行任何排序。如果您的数据顺序很重要,您应该在从 Firebase 返回结果后对应用程序中的结果进行排序。

    PHP SDK 将对返回的数据进行后处理,并按照您的预期对其进行排序。

    Martin Zeitler 已经给出了一些很好的提示,以帮助他获得答案和 cmets(我建议阅读它们,只需注意一点:不是 kreait/PHP SDK 只提供一个标准,而是 Firebase API)。

    不过我推荐以下方法之一:

    重组/非规范化数据,使其满足您的要求。非规范化在 NoSQL 数据库中是一种非常好的方法。例如,如果您需要按名称查找用户,请创建一个新树,其中键是名称,该键的子项是用户 ID。

    然后,您可以在用户树上执行另一个过滤查询,以仅返回具有给定 ID 的用户。


    使用 Firestore (https://firebase.google.com/docs/firestore/) - Firestore 提供比实时数据库更多的查询功能


    如果您想保持一切不变,将逻辑移到您的客户端应用程序中。获取所有用户(只需一个查询),然后自行过滤掉它们,例如:

    $allUsers = $firebase->getDatabase()
        ->getReference('users')
        ->getValue();
    
    $filtered = array_filter($allUsers, function (array $userData) {
        $userEmail = $userData['profile']['email'] ?? '';
        $userName = $userData['profile']['firstname'] ?? '';
    
        return stripos($userEmail, 'mail.com') !== false
            && stripos($userName, 'john') !== false;
    });
    

    我还没有实际测试过代码,但你应该明白要点。

    【讨论】:

      【解决方案4】:

      Mysql
      选择 * FROM users WHERE email='abcd@mail.com'

      Firebase
      $fetchdata = $database->getReference('users')->OrderByChild("email")->EqualTo("abcd@mail.com")->getValue();

      • $database 是数据库连接

      100% 工作试试这个

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 1970-01-01
        • 2022-07-22
        • 2014-04-03
        • 2016-06-04
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多