0], ['user_id', 'required'], ['user_id', 'exist', 'targetClass' => '\common\models\User', 'targetAttribute' => 'id'], ['nickname', 'default', 'value' => ''], ['avatar', 'default', 'value' => ''], ['score', 'default', 'value' => 0], ['fighting_capacity', 'default', 'value' => 0], ['pet_id', 'required'], ['pet_id', 'exist', 'targetClass' => '\common\modules\pet\vo\Pet', 'targetAttribute' => 'id'], ['win_count', 'default', 'value' => 0], ['fail_count', 'default', 'value' => 0], ['remaining_challenges_count', 'default', 'value' => 0], ['last_challenge_time', 'default', 'value' => 0], ['is_get_gift', 'default', 'value' => ArenaUtil::GIFT_NOT_GET], ['is_get_gift', 'in', 'range' => ArenaUtil::GIFT_GET_LIST], ['last_get_gift_time', 'default', 'value' => 0], ['last_index', 'default', 'value' => 0], ['last_update_index_time', 'default', 'value' => 0], ['last_week_index', 'default', 'value' => 0], ['created_at', 'default', 'value' => 0], ['updated_at', 'default', 'value' => 0], ]; } public function toClient() { $data = $this->toArray(); $data['index'] = $this->index; return $data; } public static function findRankList($count = 5) { $count = (int)$count; $mysql = 'SELECT * FROM (SELECT @index:=@index + 1 AS `index`, o.* FROM (SELECT @index:=0) i, arena o ORDER BY score DESC limit 0,:len) AS r'; $findList = Yii::$app->db->createCommand($mysql) ->bindValue(':len', $count) ->queryAll(); $list = []; foreach ($findList as $item) { $arena = new Arena(); $arena->setAttributes($item); $arena->setIsNewRecord(false); $arena->index = $item['index']; $arena->saveCurrentIndex(); array_push($list, $arena->toClient()); } return $list; } public static function findByUserID($userID) { $mysql = 'SELECT * FROM (SELECT @index:=@index + 1 AS `index`, o.* FROM (SELECT @index:=0) i, arena o ORDER BY score DESC) AS r WHERE user_id = :user_id'; $find = Yii::$app->db->createCommand($mysql) ->bindValue(':user_id', $userID) ->queryOne(); if (empty($find)) return null; $arena = new Arena(); $arena->setAttributes($find); $arena->setIsNewRecord(false); $arena->index = $find['index']; $arena->saveCurrentIndex(); return $arena; } public static function my_sort($a, $b) { if ($a->index == $b->index) return 0; return ($a->index < $b->index) ? -1 : 1; } /** * 寻找战力相近的玩家 * @param $fightingCapacity * @return array|null */ public static function findAllByFightingCapacity($userID, $fightingCapacity, $score) { //战力排行 $fightingCapacity = (int)$fightingCapacity; $mysql = 'SELECT * FROM arena WHERE fighting_capacity > :fighting_capacity LIMIT 0 , 3'; $findList = Yii::$app->db->createCommand($mysql) ->bindValue(':fighting_capacity', $fightingCapacity) ->queryAll(); $userIDList = []; $list = []; foreach ($findList as $item) { $arena = self::findByUserID($item['user_id']); if ($arena->user_id == $userID) continue; array_push($userIDList, $arena->user_id); array_push($list, $arena); } $rList = $list; if (count($list) < 3) { $topList = self::findRankList(); foreach ($topList as $item) { if (count($rList) == 3 || $item['user_id'] == $userID) continue; if (!in_array($item['user_id'], $userIDList)) { array_push($rList, $item); } } } //等级排行 $levelMysql = 'SELECT * FROM (SELECT @index:=@index + 1 AS `index`, o.* FROM (SELECT @index:=0) i, arena o ORDER BY score DESC) AS r WHERE score > :score ORDER BY r.index DESC LIMIT 1 , 3'; $levelFindList = Yii::$app->db->createCommand($levelMysql) ->bindValue(':score', $score) ->queryAll(); foreach ($levelFindList as $item) { if ($item['user_id'] == $userID) continue; if (!in_array($item['user_id'], $userIDList)) { array_push($rList, self::findByUserID($item['user_id'])); } } usort($rList, array('common\modules\arena\vo\Arena', 'my_sort')); $rList = array_slice($rList, 0, 3); $list=[]; for ($i = 0; $i < count($rList); $i++) { array_push($list,$rList[$i]->toClient()); } return $list; } /** * 获取参战宠物战力排行 * @param $userID * @param $fight * @return Arena|null */ public static function findPetFightRankingByUserID($userID, $fight) { $mysql = 'SELECT * FROM (SELECT @index:=@index + 1 AS `index`, o.* FROM (SELECT @index:=0) i, arena o ORDER BY fighting_capacity DESC) AS r WHERE user_id = :user_id'; $find = Yii::$app->db->createCommand($mysql) ->bindValue(':user_id', $userID) ->queryOne(); if (empty($find)) return null; $arena = new Arena(); $arena->setAttributes($find); $arena->setIsNewRecord(false); $arena->index = $find['index']; $arena->saveCurrentIndex(); return $arena; } public function saveCurrentIndex() { //记录上周排名 $change = false; if ($this->last_update_index_time == CommUtil::getWeekTime(time() - 3600 * 24 * 7)) { $this->last_week_index = $this->last_index; $change = true; } //记录当前排名 if ($this->index != $this->last_index) { $this->last_index = $this->index; $this->last_update_index_time = CommUtil::getWeekTime(time()); $change = true; } if ($change && !$this->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR, $this->getErrors()); } }