使用calebporzio/sushi处理外部数据,Eloquent分页为空如何解决?
问题解答
哪种分页方式正确?
应该使用第二种静态调用方式:Point::offset(0)->limit(1000)->paginate(...)。
Sushi trait是为Eloquent模型类扩展查询能力,静态调用会触发Sushi内置的查询逻辑;而直接实例化对象($newPoint)后调用分页,无法正确绑定Sushi的数据加载机制,导致无法读取到你手动赋值的rows数据。
解决分页数据为空的步骤
1. 按Sushi要求定义数据源
不要手动给实例的rows属性赋值,而是在Point模型中定义getRows()方法,Sushi会自动调用这个方法获取外部API数据:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Sushi\Sushi; use Illuminate\Support\Facades\Http; class Point extends Model { use Sushi; // Sushi会自动调用该方法加载数据 protected function getRows() { // 请求外部API $apiResponse = Http::get('你的外部API地址'); // 确保返回一维数组,每个元素是模拟数据库行的关联数组 // 若API返回嵌套结构(如包含data字段),需提取对应部分 return $apiResponse->json(); // 示例:API返回{"data": [...]}时,用 return $apiResponse->json()['data']; } }
2. 修正分页调用逻辑
不需要手动添加offset()和limit(),paginate()方法会自动处理分页偏移和条数:
// 基础用法:每页显示$first条数据 $points = Point::paginate($first); // 带自定义分页参数的用法(指定页码参数名、当前页码) $points = Point::paginate($first, ['*'], 'page', $page);
3. 验证API数据格式
确保API返回的数据是一维数组,每个元素是关联数组(类似数据库表的一行数据)。如果API返回的是对象、多层嵌套数组等格式,需要先转换为符合要求的结构,否则Sushi无法正确解析数据。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

