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()); }
/** * @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); } } } }
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']); }