Firebase使用PHP过滤数据

时间:2018-08-16 18:50:42

标签: php firebase

我正在使用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数据结构。 Firebase Database structure

4 个答案:

答案 0 :(得分:2)

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")

答案 1 :(得分:1)

hasChildren('email')返回布尔值,并且您无法使用->getValue()方法进行链接。

答案 2 :(得分:0)

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已经给出了一些很好的技巧来获得答案和评论(我建议阅读它们,只是一个注意事项:不是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;
});

我尚未实际测试代码,但是您应该了解要点。

答案 3 :(得分:-1)

<块引用>

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

<块引用>

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

  • $database 是数据库连接

100% 工作试试这个