Laravel无需join如何按关联模型字段对Paginator分页对象进行排序
方案1(首选:全局排序+原生分页器)
直接在查询阶段用子查询实现关联字段排序,完全不需要写join,排序在SQL层面完成,返回原生分页器实例,所有分页方法(appends/links等)都可以正常使用:
// 排序逻辑分支判断 if ($sort['column'] === 'price') { $products = $products->orderBy( // 子查询匹配关联的价格字段 \App\Models\ProductInventoryDetail::select('price') ->whereColumn('id', 'products.selected_inventory_id'), $sort['order'] ); } else { $products = $products->orderBy($sort['column'], $sort['order']); } // 正常执行分页 $products = $products->paginate($limit); // 直接追加URL参数即可 $products->appends($paramsArr);
该方案性能最优,且是全局排序(对全表产品按价格排序后再分页),符合绝大多数业务场景的需求。
方案2(仅当前页排序适用)
如果确实需要先分页再对单页内的结果排序,不需要全局排序,可以直接替换分页器内的集合,不需要修改原有分页逻辑:
// 先执行原生分页 $products = $products->paginate($limit); // 对当前页的数据集排序 $sortedItems = $products->getCollection()->sortBy(function ($prod) { return $prod->selected->price; }); // 将排序后的集合装回原分页器对象 $products->setCollection($sortedItems); // 分页器原有方法不受影响 $products->appends($paramsArr);
注意该方案仅对当前分页的N条数据排序,不是对全表产品排序,按需选用。
内容的提问来源于stack exchange,提问作者Saud
相关产品推荐
相关产品推荐

