Laravel从Firestore导出数据到HTML表遇QuerySnapshot::count()未定义错误
解决Firestore QuerySnapshot调用count()方法的致命错误
错误原因
Google Cloud Firestore的QuerySnapshot类没有提供count()方法,你调用该方法触发了致命错误。同时你的分页逻辑中startAt的用法也存在问题。
修复方案
1. 替换count()为正确的文档数量获取方式
有两种可靠方式获取返回的文档数量:
- 直接使用已构建的
$data数组的长度(因为你已经遍历所有文档到数组中) - 使用Firestore SDK提供的
size()方法($documents->size())
同时,为了更稳妥地获取最后一个文档的ID,建议在遍历文档时直接记录最后一个文档对象,避免依赖QuerySnapshot的last()方法可能带来的迭代器问题。
2. 修正startAt的分页参数
startAt接受单个DocumentSnapshot对象作为参数,不需要将其包裹在数组中。
修改后的控制器代码
public function history(Request $request) { $history = app('firebase.firestore')->database()->collection($this->tablenamePayment); $lastVisible = null; if ($request->input('last_visible')) { $lastVisible = $history->document($request->input('last_visible'))->snapshot(); } // 修正startAt参数,直接传快照对象(如果存在) $query = $lastVisible ? $history->startAt($lastVisible) : $history; $documents = $query->limit(2000)->documents(); $data = []; $lastDocument = null; foreach ($documents as $document) { $data[] = [ 'id' => $document->id(), 'name' => $document->get('name'), 'email' => $document->get('email'), ]; $lastDocument = $document; } $nextVisible = null; // 使用$data的长度判断是否达到分页上限 if (count($data) === 2000) { $nextVisible = $lastDocument->id(); } return view('admin.payment-history', compact('data', 'nextVisible')); }
说明
- 用
count($data)替代$documents->count(),直接利用已收集的数据数组长度,避免调用不存在的方法 - 遍历文档时记录
$lastDocument,确保能正确获取分页所需的最后一个文档ID - 修正
startAt的参数传递方式,符合Firestore PHP SDK的要求,保证分页逻辑正确运行
内容的提问来源于stack exchange,提问作者Tunde Adam
相关产品推荐
相关产品推荐

