thinkphp6 模型自定义排序
业务场景:用户浏览过的酒店记录
业务解决方案:如果采用Mysql记录太过于麻烦,我这面用redis的Key=>value将每次浏览过的数据已JSON数组存入,
$redisArr = cache($redisKey); if (!$redisArr) { cache($redisKey, json_encode([$hotelId])); } else { $redisArr = json_decode($redisArr, true); if (array_search($hotelId, $redisArr) === false) { array_push($redisArr, $hotelId); cache($redisKey, json_encode($redisArr)); } }
这是写入代码,每次利用array_push加入到最后
那么在取出的时候,查询只需要限定ID即可
例如这样:
$list = $this->model ->where('id', 'in', $hotelIds) ->field($field) ->order(Str::getModelOrderSort('id', $hotelIds)) ->page($page, $page_size) ->select();
估计是因为版本改动较大的原因,之前的一些方法已经无法使用,经过查看order代码,找到了这个类:
think\db\Raw
这里我就将方法贴出来,你们直接使用即可,记得引入该类:
/** * @param string $field [字段] * @param array $sortArr [排序数组] * @return Raw * 时间:2020/11/19 16:17 * 联系:9258405 * 生成MODEL自定义顺序 */ public static function getModelOrderSort(string $field, array $sortArr): Raw { return new Raw("field($field," . implode(',', $sortArr) . ")"); }
好了,这就是解决办法,如果有什么问题,请直接联系我QQ,或者邮箱也行