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;
});
我还没有实际测试过代码,但你应该明白要点。