'boolean', 'random_count' => 'integer', 'reward_mode' => 'integer', ]; /** * 获取奖励组中的所有奖励项 * * @return HasMany */ public function rewardItems(): HasMany { return $this->hasMany(GameRewardItem::class, 'group_id', 'id'); } /** * 获取关联的标签(多态关联) * * @return \Illuminate\Database\Eloquent\Relations\MorphToMany */ public function tags() { return $this->morphToMany(GameTag::class, 'taggable', 'game_tag_relations', 'taggable_id', 'tag_id'); } /** * 格式化奖励详情用于显示 * * @return string */ public function formatRewardDetails(): string { if ($this->rewardItems->isEmpty()) { return '暂无奖励项'; } $details = []; foreach ($this->rewardItems as $item) { $detail = $this->formatSingleRewardItem($item); $details[] = $detail; } return '
' . implode('
', $details) . '
'; } /** * 格式化标签用于显示 * * @return string */ public function formatTags(): string { if ($this->tags->isEmpty()) { return '无标签'; } $tagHtml = []; foreach ($this->tags as $tag) { $tagHtml[] = $tag->formatTag(); } return implode(' ', $tagHtml); } /** * 格式化单个奖励项 * * @param GameRewardItem $item * @return string */ private function formatSingleRewardItem(GameRewardItem $item): string { // 使用统一的奖励类型描述器 $displayText = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromModel($item, true); $weight = $item->weight; $guaranteed = $item->is_guaranteed ? '必中' : '非必中'; return sprintf( '%s (权重: %.2f, %s)', $displayText, $weight, $guaranteed ); } }