调用数组的paginate()成员函数报错:第三方API获取数据无法实现分页
报错根因
Call to a member function paginate() on array 报错的核心原因:
paginate()是Laravel框架为Eloquent查询构造器、数据库查询结果集提供的专属方法,你从第三方API获取到的数据经过json_decode($one , true)处理后是普通PHP数组,没有内置paginate方法,无法直接调用。
解决方案
你可以使用Laravel官方提供的LengthAwarePaginator类手动为数组生成符合Laravel分页规范的实例,修改后的代码逻辑如下:
- 第一步:在控制器顶部引入依赖类
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Http\Request;
- 第二步:修改render方法中的分页逻辑
public function render(Request $request) { try { $api = new \Binance\API('api','secret'); $prices = $api->coins(); // 此处json_encode再json_decode的操作冗余,如果$api->coins()已经返回数组可直接删除 $coins = json_decode(json_encode($prices, true), true); // 手动分页配置 $perPage = 10; $currentPage = $request->input('page', 1); $offset = ($currentPage - 1) * $perPage; // 截取当前页数据 $currentPageData = array_slice($coins, $offset, $perPage); // 生成分页实例 $paginatedCoins = new LengthAwarePaginator( $currentPageData, count($coins), $perPage, $currentPage, [ 'path' => $request->url(), 'query' => $request->query() ] ); return view('livewire.backend.crypto.cryptolist')->with('coins' , $paginatedCoins); }catch(\Exception $e) { return view('wrong')->with('e' , $e); } }
注意事项
- 生成的
$paginatedCoins实例和数据库查询返回的分页对象用法完全一致,视图中可以直接调用$coins->links()渲染分页按钮,不需要修改原有视图分页逻辑。 - 如果你的项目中已经将数组转为Laravel集合,也可以直接调用集合的
forPage($page, $perPage)方法快速获取当前页数据,再手动生成分页实例即可。 - 代码中冗余的JSON编解码步骤可以直接删除,减少不必要的性能开销。
内容的提问来源于stack exchange,提问作者Awminux
相关产品推荐
相关产品推荐

