You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动创建分页器时触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:38:17