获取PHP、Firebase中集合中的所有文档



在Cloud Firestore文档中:https://firebase.google.com/docs/firestore/query-data/get-data

我已经复制了这个例子:

$citiesRef = $db->collection('cities');
$citiesRef->document('SF')->set([
'name' => 'San Francisco',
'state' => 'CA',
'country' => 'USA',
'capital' => false,
'population' => 860000
]);
$citiesRef->document('LA')->set([
'name' => 'Los Angeles',
'state' => 'CA',
'country' => 'USA',
'capital' => false,
'population' => 3900000
]);
$citiesRef->document('DC')->set([
'name' => 'Washington D.C.',
'state' => null,
'country' => 'USA',
'capital' => true,
'population' => 680000
]);
$citiesRef->document('TOK')->set([
'name' => 'Tokyo',
'state' => null,
'country' => 'Japan',
'capital' => true,
'population' => 9000000
]);
$citiesRef->document('BJ')->set([
'name' => 'Beijing',
'state' => null,
'country' => 'China',
'capital' => true,
'population' => 21500000
]);
printf('Added example cities data to the cities collection.' . PHP_EOL);

和请求:

$citiesRef = $db->collection('cities');
$query = $citiesRef->where('capital', '=', true);
$documents = $query->documents();
foreach ($documents as $document) {
if ($document->exists()) {
printf('Document data for document %s:' . PHP_EOL, $document->id());
print_r($document->data());
printf(PHP_EOL);
} else {
printf('Document %s does not exist!' . PHP_EOL, $snapshot->id());
}
}

我不能去else块。如果我将where('capital', '=', true)更改为where('capital', '=', 'test'),则条件应为false,并且我进入else块,因为文档no '不存在。

但是我有一个空白页。有人能给我解释一下吗?谢谢你。

查询已经只返回集合中与查询匹配的文档,这就是为什么结果集中存在每个文档的原因。

  • $citiesRef->where('capital', '=', true);只返回字段capital存在的文档,而不考虑其值(=来自示例数据集的所有文档-没有capital字段的文档将不返回)
  • $citiesRef->where('capital', '=', 'test');只返回字段capital等于test(= no documents)的文档

由于这个原因,您甚至不输入if条件:返回的文档集合为空。

当您尝试直接通过ID访问文档时,$document->exists()方法很有用:

$doc = $citiesRef->document('non-existing-document-id')仍然会返回DocumentReference对象,但这里$doc->exists()将返回false。

长话短说😅,您可以从循环中删除条件:

$citiesRef = $db->collection('cities');
$query = $citiesRef->where('capital', '=', true);
$documents = $query->documents();
foreach ($documents as $document) {
printf('Document data for document %s:' . PHP_EOL, $document->id());
print_r($document->data());
printf(PHP_EOL);
}

,并尝试确认exists()方法按预期工作:

$doc = $citiesRef->document('test')->snapshot();
if ($doc->exists()) {
printf('The document with ID "%s" exists.'.PHP_EOL, $doc->id());
} else {
printf('The document with ID "%s" does NOT exist.'.PHP_EOL, $doc->id());
}

在第一个条件中,

  • where('capital', '=', true)

它进入forEach块,因为它返回一些匹配的文档。即$documents的长度为> 0

  • where('capital', '=', 'test')

这不会进入forEach循环,因为没有从firestore检索到匹配的文档。即$documents的长度为== 0

因此,在迭代$documents之前,您必须检查检索的$documents是否为空或其中是否有任何文档。

在JS中,(因为我不懂PHP)

if (documents.empty) {
console.log('No matching documents.');
return;
}  
documents.forEach(doc => {
console.log(doc.id, '=>', doc.data());
});
  • 调用exists()是有用的,只有当您通过它的引用检索文档时。如果在DocumentReference引用的位置没有文档,则结果文档将为空,并且调用exists()将返回false。

最新更新