public function getList(User $user, BattleFilterForm $filter)
 {
     $query = (new \yii\db\Query())->select(['reason_id' => '{{death_reason}}.[[id]]', 'count' => 'SUM({{battle_death_reason}}.[[count]])'])->from('battle')->innerJoin('battle_death_reason', '{{battle}}.[[id]] = {{battle_death_reason}}.[[battle_id]]')->innerJoin('death_reason', '{{battle_death_reason}}.[[reason_id]] = {{death_reason}}.[[id]]')->leftJoin('rule', '{{battle}}.[[rule_id]] = {{rule}}.[[id]]')->leftJoin('game_mode', '{{rule}}.[[mode_id]] = {{game_mode}}.[[id]]')->leftJoin('lobby', '{{battle}}.[[lobby_id]] = {{lobby}}.[[id]]')->leftJoin('map', '{{battle}}.[[map_id]] = {{map}}.[[id]]')->leftJoin('weapon', '{{battle}}.[[weapon_id]] = {{weapon}}.[[id]]')->leftJoin('weapon_type', '{{weapon}}.[[type_id]] = {{weapon_type}}.[[id]]')->leftJoin('subweapon', '{{weapon}}.[[subweapon_id]] = {{subweapon}}.[[id]]')->leftJoin('special', '{{weapon}}.[[special_id]] = {{special}}.[[id]]')->andWhere(['{{battle}}.[[user_id]]' => $user->id])->groupBy('{{death_reason}}.[[id]]');
     if ($filter && !$filter->hasErrors()) {
         $this->filter($query, $filter);
     }
     $list = $query->createCommand()->queryAll();
     // 必要な死因名の一覧を作る
     $deathReasons = [];
     array_map(function ($o) use(&$deathReasons) {
         $deathReasons[$o->id] = $o->getTranslatedName();
     }, DeathReason::findAll(['id' => array_map(function ($row) {
         return $row['reason_id'];
     }, $list)]));
     $ret = array_map(function ($row) use($deathReasons) {
         return (object) ['name' => @$deathReasons[$row['reason_id']] ?: '?', 'count' => (int) $row['count']];
     }, $list);
     usort($ret, function ($a, $b) {
         if ($a->count !== $b->count) {
             return $b->count - $a->count;
         }
         return strcasecmp($a->name, $b->name);
     });
     return $ret;
 }
 public function run()
 {
     $response = Yii::$app->getResponse();
     $response->format = 'json';
     $form = new DeathReasonGetForm();
     $form->attributes = Yii::$app->getRequest()->get();
     if (!$form->validate()) {
         $response->statusCode = 400;
         return ['error' => $form->getErrors()];
     }
     $query = DeathReason::find()->with(['type'])->orderBy('[[id]]');
     $form->filterQuery($query);
     return array_map(function ($model) {
         return $model->toJsonArray();
     }, $query->all());
 }
Beispiel #3
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getReasons()
 {
     return $this->hasMany(DeathReason::className(), ['id' => 'reason_id'])->viaTable('battle_death_reason', ['battle_id' => 'id']);
 }
 public function toDeathReasons(Battle $battle)
 {
     if (is_array($this->death_reasons) || $this->death_reasons instanceof \stdClass) {
         $unknownCount = 0;
         foreach ($this->death_reasons as $key => $count) {
             $reason = DeathReason::findOne(['key' => $key]);
             if ($key === 'unknown' || !$reason) {
                 $unknownCount += (int) $count;
             } else {
                 $o = new BattleDeathReason();
                 $o->battle_id = $battle->id;
                 $o->reason_id = $reason->id;
                 $o->count = (int) $count;
                 (yield $o);
             }
         }
         if ($unknownCount > 0) {
             $reason = DeathReason::findOne(['key' => 'unknown']);
             if ($reason) {
                 $o = new BattleDeathReason();
                 $o->battle_id = $battle->id;
                 $o->reason_id = $reason->id;
                 $o->count = (int) $unknownCount;
                 (yield $o);
             }
         }
     }
 }
Beispiel #5
0
 public function getDeathReasonNamesFromEvents()
 {
     try {
         if ($this->events === null || $this->events === '') {
             return [];
         }
         $events = Json::decode($this->events, false);
         if (!is_array($events) || empty($events)) {
             return [];
         }
         // ["key" => null] のデータを一回構築する
         // 後でこの key を取得して理由名取得に回す
         $ret = [];
         foreach ($events as $event) {
             if (is_array($event)) {
                 $event = (object) $event;
             }
             if (is_object($event) && isset($event->type) && isset($event->reason) && $event->type === 'dead') {
                 $ret[$event->reason] = null;
             }
         }
         if (empty($ret)) {
             return [];
         }
         // null だった理由名を埋める
         $reasons = namespace\DeathReason::find()->andWhere(['key' => array_keys($ret)])->all();
         foreach ($reasons as $reason) {
             $ret[$reason->key] = $reason->getTranslatedName();
         }
         return $ret;
     } catch (\Exception $e) {
         return [];
     }
 }
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getReason()
 {
     return $this->hasOne(DeathReason::className(), ['id' => 'reason_id']);
 }
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getDeathReasons()
 {
     return $this->hasMany(DeathReason::className(), ['type_id' => 'id']);
 }