手动创建分页器时触发array_slice()参数类型异常问题
解决Laravel中Union查询后手动分页的array_slice报错问题
嘿,我来帮你搞定这个报错!你遇到的array_slice() expects parameter 1 to be array, object given问题,核心原因是你把Laravel的查询对象/集合对象当成普通数组来用了——PHP原生的array_slice不认这些对象,只认纯数组。
错误原因拆解
你用Union拼接三个查询后,不管是查询构建器对象,还是执行get()后得到的Illuminate\Support\Collection集合对象,都不是普通数组。直接给array_slice传这些对象,自然会触发类型错误。
修正方案:用Laravel集合的切片方法(推荐)
下面是调整后的完整代码,我帮你补全了未写完的查询逻辑,同时替换成符合Laravel规范的分页方式:
public function index(Request $request) { // 1. 构建三个查询:明确指定列,避免*导致列数/列名不一致 $TMUDue = Equipments::where('due1', '<>', '1990-01-01') ->select('id', 'equipment_name', 'due1 AS newDate'); // 替换成你实际需要的列 $CalDue = Equipments::where('due2', '<>', '1990-01-01') ->select('id', 'equipment_name', 'due2 AS newDate'); $SerDue = Equipments::where('due3', '<>', '1990-01-01') // 补全第三个查询的条件 ->select('id', 'equipment_name', 'due3 AS newDate'); // 2. 合并查询:用unionAll保留所有数据(需要去重就用union) $combinedQuery = $TMUDue->unionAll($CalDue)->unionAll($SerDue); // 3. 执行查询+排序,得到集合对象 $allItems = $combinedQuery->orderBy('newDate')->get(); // 4. 手动分页逻辑:用集合的slice方法替代array_slice $perPage = 10; // 每页显示条数 $currentPage = $request->input('page', 1); // 默认第1页 $offset = ($currentPage - 1) * $perPage; // 用Collection的slice方法获取当前页数据 $paginatedItems = $allItems->slice($offset, $perPage); // 计算总页数 $totalPages = ceil($allItems->count() / $perPage); // 传递数据到视图 return view('equipments.index', compact('paginatedItems', 'currentPage', 'totalPages')); }
更偷懒的方式:用Laravel自带分页器
其实完全不用手动写分页逻辑,Laravel支持直接对Union后的查询调用paginate(),它会自动帮你处理分页、总条数、分页链接:
public function index(Request $request) { // 同样先构建三个查询... $combinedQuery = $TMUDue->unionAll($CalDue)->unionAll($SerDue); // 直接调用paginate,指定每页条数 $paginatedItems = $combinedQuery->orderBy('newDate')->paginate(10); // 视图里可以直接用{{ $paginatedItems->links() }}生成分页按钮 return view('equipments.index', compact('paginatedItems')); }
关键注意点
- Union查询的列一致性:必须保证三个查询返回的列数、列顺序(除了别名)完全一致,用
*容易出问题,最好明确列出需要的字段。 - 集合vs数组:Laravel的Collection是封装后的对象,有自己的一套方法(比如
slice()、filter()),尽量用这些方法替代PHP原生数组函数,更符合框架规范。
内容的提问来源于stack exchange,提问作者marco_nz
相关产品推荐
相关产品推荐

