where(['user_id' => $user_id, 'room_id' => $room_id, 'room_no' => $room_no, 'session' => $session])->first()) { $res = self::query()->insert(['user_id' => $user_id, 'room_id' => $room_id, 'room_no' => $room_no, 'session' => $session, 'like' => $num]); } else { $res = self::query()->where('id', $info['id'])->increment('like', $num); } // redis 排行榜集合 RedisUtil::getInstance(RedisKeyEnum::ROOM_USER_LIST,$room_no)->zIncrBy($num,$user_id); return $res; } /** * 观众排行榜 * @param string $room_no * @param int $user_id 主播ID * @param int $num * @return array * @throws \Exception */ public function getTopList(string $room_no, int $user_id, int $num = 50) { $onList = RedisUtil::getInstance(RedisKeyEnum::ROOM_USER_LIST, $room_no)->zRevRange(0, $num); $key = array_search($user_id, $onList); if ($key !== false) { unset($onList[$key]); } else if (count($onList) > $num) { // 如果没有主播自己,且数量大于 num 则需要去掉最后一个 array_pop($onList); } $model = new UserModel(); $list = $model->getList(params: ['ids' => $onList,'list_rows' => $num],select: ['id','nickname','avatar']); $list = array_columns($list,'id,nickname,avatar','id'); $top = []; foreach ($onList as $key => $val) { if (isset($list[$val][0])){ $top[] = [ 'id' => (int)$val, 'nickname' => $list[$val][0]['nickname'], 'avatar' => cdn_url($list[$val][0]['avatar']), 'chat_id' => im_prefix($list[$val][0]['id']), 'rank' => $key + 1 ]; } } return $top; } // 开播日志 public function user() { return $this->hasOne(UserModel::class, 'id', 'user_id'); } }