在 thinkphp 5.1 中,把前端的 sort 参数映射到固定排序字段和方向,再用 order() 和 paginate() 查询。适用于已有商品表的维护项目,示例按价格升序、销量降序和商品 id 降序展示。
用排序选项白名单生成查询
把下列方法放入现有商品控制器,假设商品表包含 id、price、sales、status。新品用递增 ID 近似,需要按业务发布时间排序时换成项目的发布时间字段。
public function index()
{
$options = [
'new' => ['id' => 'desc'],
'price' => ['price' => 'asc', 'id' => 'desc'],
'sales' => ['sales' => 'desc', 'id' => 'desc'],
];
$sort = request()->get('sort', 'new');
if (!is_string($sort) || !isset($options[$sort])) {
$sort = 'new';
}
$list = \think\Db::name('goods')
->where('status', 1)
->order($options[$sort])
->paginate(12, false, ['query' => ['sort' => $sort]]);
return view('index', ['list' => $list, 'sort' => $sort]);
}

同价或同销量时以 ID 降序作为第二排序键。分页链接保留后端已校验的 sort 值。
给排序按钮和分页链接保留参数
将以下片段放入商品列表模板。假设当前页面就是商品列表入口。
<nav><a href="?sort=new">新品</a>
<a href="?sort=price">价格从低到高</a>
<a href="?sort=sales">销量从高到低</a>
</nav>
{$list->render()|raw}

切换排序时从第一页开始。可用传入模板的 sort 给当前按钮添加高亮。
翻到第二页检查顺序是否一致
在测试环境用这些查询参数打开同一个列表地址。
?sort=price ?sort=price&page=2 ?sort=sales ?sort=unexpected

第二页继续按价格排序。未知值按新品排序。可用两条同价记录确认 ID 次序符合预期。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











