如何按动态值数组排序记录,使指定ID排在查询结果最上方?
你之前的写法失效是因为 MySQL 的 FIELD() 函数对于不在传入参数列表中的 ID 会返回 0,默认升序排序时,返回 0 的非目标 ID 会排在返回 1、2 的目标 ID 前面,所以只有搭配 whereIn 过滤掉非目标 ID 时才会生效。
要实现全量查询、指定 ID 置顶的需求,只需要加一层排序条件,先把目标 ID 整体提到最前面,再按你需要的 ID 顺序排列即可:
$ids = [15, 20]; // 先将ID转成整数避免SQL注入风险 $idStr = implode(',', array_map('intval', $ids)); $list = $list // 第一层排序:目标ID排在所有非目标ID前面 ->orderByRaw("id IN ($idStr) DESC") // 第二层排序:目标ID按你指定的数组顺序排列 ->orderByRaw("FIELD(id, $idStr)") ->get();
如果ID数组是用户可控的,推荐使用参数绑定的写法,避免SQL注入:
$ids = [15, 20]; $placeholders = implode(',', array_fill(0, count($ids), '?')); $list = $list ->orderByRaw("id IN ($placeholders) DESC", $ids) ->orderByRaw("FIELD(id, $placeholders)", $ids) ->get();
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

